close

Java Uzak Yöntem Çağırma

Navigasyona git Aramaya git

RMI ( Java Uzak Yöntem Çağırma ), bir yöntemi uzaktan çağırmak için Java tarafından sunulan bir mekanizmadır . Standart Java çalışma zamanı ortamının bir parçasıdır ve yalnızca dağıtılmış Java uygulamalarında sunucu iletişimi için basit bir mekanizma sağlar. Diğer teknolojiler arasında iletişim gerekiyorsa RMI yerine CORBA veya SOAP kullanılmalıdır.

RMI, özellikle Java için tasarlandığından programlamada kullanım kolaylığı ile karakterize edilir; referansa göre nesne geçişi (SOAP tarafından izin verilmez), dağıtılmış çöp toplama (Dağıtılmış Çöp Toplayıcı) ve rastgele tip geçiş (işlevsellik CORBA tarafından sağlanmaz) sağlar.

RMI aracılığıyla, bir Java programı bir nesneyi dışa aktarabilir , bu da nesneyi ağ üzerinden erişilebilir hale getirir ve programı bir TCP bağlantı noktasından istekleri bekler hale getirir . Bundan sonra, bir istemci nesne tarafından sağlanan yöntemleri bağlayabilir ve çağırabilir.

Çağrı aşağıdaki adımlardan oluşur:

  • Parametre sıralama ( Java'nın serileştirme işlevini kullanarak).
  • Yöntemin çağrılması (sunucudaki istemcinin). Arayan kişi yanıt bekler.
  • Yürütme tamamlandıktan sonra, sunucu (varsa) dönüş değerini seri hale getirir ve istemciye gönderir.
  • İstemci kodu yanıtı alır ve çağrı yerelmiş gibi devam eder.

Bağlam

JDK sürüm 1.1'den bu yana, Java'nın kendi ORB'si vardır : RMI (Uzaktan Yöntem Çağırma). RMI genel anlamda bir ORB olmasına rağmen, CORBA uyumlu bir model değildir. RMI, Java'ya özgüdür, yani çekirdek dilin bir uzantısıdır. RMI, tamamen Java Nesne Serileştirmenin özüne ve aynı zamanda diğer sistemlerde vb. nesneleri yüklemek ve boşaltmak için hem taşınabilirlik hem de mekanizmaların uygulanmasına dayanır.

Herhangi bir Java programcısı için RMI kullanımı çok doğaldır, çünkü geliştireceğinden tamamen farklı yeni bir teknoloji öğrenmek zorunda değildir. Bununla birlikte, RMI'nin Java ile sıkı entegrasyonu nedeniyle bazı sınırlamaları vardır, en önemlisi bu teknolojinin başka bir dilde yazılmış uygulamalarla etkileşime izin vermemesidir.

Java'nın bir uzantısı olarak RMI, yürütülebilir kod yazıp düzenleyerek sorunları çözmek için tasarlanmış bir programlama teknolojisidir. Böylece RMI, C, C++, Smalltalk, vb. ile birlikte programlama teknolojileri alanında belirli bir nokta oluşturur.

RPC ve RMI kullanma arasındaki temel fark, RMI'nin nesneler arasındaki etkileşimi destekleyen Java programlama diline dayalı bir uzaktan yordam çağırma mekanizması olmasına karşın RPC'nin bu özelliği desteklememesidir.

Mimari

RMI mimarisi dört katmanlı bir model olarak görülebilir.

İlk katman

İlk katman, uygulama katmanıdır ve istemci ve sunucu uygulamalarının gerçek uygulamasına karşılık gelir. Uzak nesnelere erişmek ve bunları dışa aktarmak için üst düzey çağrılar burada gerçekleşir. Yöntemlerinin uzak istemciler tarafından erişilebilir olmasını isteyen herhangi bir uygulama, bu yöntemleri java.rmi.Remote'u genişleten bir arabirimde bildirmelidir. Böyle bir arayüz, temel olarak bir nesneyi uzaktan erişilebilir olarak "işaretlemek" için kullanılır. Yöntemler uygulandıktan sonra, nesne dışa aktarılmalıdır. Bu, nesne UnicastRemoteObject sınıfını (java.rmi.server paketi) genişletiyorsa örtük olarak yapılabilir veya aynı paketin exportObject() yöntemi çağrılarak açıkça yapılabilir.

İkinci katman

Katman 2, proxy katmanı veya saplama-iskelet katmanıdır. Bu katman, uygulama katmanıyla doğrudan etkileşime giren katmandır. Uzak nesnelere ve eylemlere yapılan tüm çağrılar, parametreleri ve geri dönen nesnelerle birlikte bu katmanda gerçekleşir.

Üçüncü katman

Katman 3, uzak referans katmanıdır ve uzak çağrıların anlamsal kısmının işlenmesinden sorumludur. Ayrıca, nesne çoğaltmayı yönetmekten ve anlamsal kalıcılık ve kayıp bağlantılardan kurtarmak için uygun stratejiler oluşturmak gibi uzak nesnelerle uygulamaya özel görevleri gerçekleştirmekten de sorumludur. Bu katmanda, taşıma katmanından akış yönelimli bir bağlantı beklenir.

Dördüncü Katman

Katman 4, taşıma katmanıdır. Gerekli bağlantıların yapılmasından ve verilerin bir makineden diğerine taşınmasının yönetilmesinden sorumludur. RMI için temel aktarım protokolü, yalnızca Java programları tarafından "anlaşılan" Java Uzak Yöntem Protokolüdür (JRMP).

Öğeler

Her RMI uygulaması normalde 2 kısma ayrılır:

  • Bazı uzak nesneler oluşturan bir sunucu, bunları erişilebilir kılmak için referanslar oluşturur ve istemcinin bunları çağırmasını bekler.
  • Sunucudaki uzak nesnelere referans alan ve onları çağıran bir istemci.

Örnek

Bir RMI sunucusu, istemciler tarafından kullanılacak bir uzak nesnenin tanımlanmasından oluşur. Uzak bir nesne oluşturmak için bir arabirim tanımlanır ve uzak nesne, bu arabirimi uygulayan bir sınıf olacaktır. Şimdi 3 adımda örnek bir sunucunun nasıl oluşturulacağını görelim:

  • Uzak arayüzü tanımlayın. Uzak bir arayüz oluşturulduğunda:
    • Arayüz herkese açık olmalıdır.
    • Herhangi bir Java sanal makinesinden çağrılabileceğini belirtmek için java.rmi.Remote arabiriminden devralmalıdır.
    • Her uzak yöntem, işleyebileceği istisnalara ek olarak, throws yan tümcesinde java.rmi.RemoteException istisnasını atmalıdır.
genel  arabirim  MyRemoteInterface ,  java'yı genişletir  . rmi . Remote { public void myMethod1 () , Java'yı atar . rmi . RemoteException ; public int myMethod2 () java'yı atar . rmi . RemoteException ; }

      
      

  • Uzak arayüzü uygulayın
public  class  MyRemoteClass ,  
 Java'yı genişletir  . rmi . sunucu _ UnicastRemoteObject , MyRemoteInterface'i uygular { public MyRemoteClass () , Java'yı atar . rmi . RemoteException { süper (); //Temel sınıfın (UnicastRemoteObject) yapıcısını çağırın // Yapıcı kodu } 
  

    
 
    
   
 
 
 public  void  myMethod1 ()  java'yı atar  . rmi . RemoteException { // Buraya istediğimiz kodu koyuyoruz System . dışarı . println ( "myMethod1()'deyim" ); }
 
   
   
 

 public  int  myMethod2 ()  java'yı atar  . rmi . RemoteException { dönüş 5 ; // Buraya istediğimiz kodu koyuyoruz }
 
     
 

 public  void  otherMethod () 
 { 
   // Başka bir metot tanımlarsak 
   , uzak arayüzden olmadığı için // uzaktan çağrılamaz 
 }
 
 public  static  void  main ( String []  args ) 
 { 
   try 
   { 
     MyRemoteInterface  mir  =  new  MyRemoteClass (); 
     java . rmi . adlandırma . rebind ( "rmi://"  +  Java .net . InetAddress . getLocalHost (). getHostAddress ( ) + ":" + args [ 0 ] + "/TestRMI" , mir ); } yakalama ( İstisna e ) { e . printStackTrace (); } } } 
                                  
   
     
   
     
   
 

  • Gördüğünüz gibi MyRemoteClass sınıfı, daha önce tanımladığımız MyRemoteInterface arabirimini uygular. Ayrıca, uzak nesneleri uygulamak için bir üst sınıf olarak kullanabileceğimiz bir Java sınıfı olan UnicastRemoteObject'ten miras alır.
  • Ardından, sınıfın içinde bir kurucu (UnicastRemoteObject üst sınıfı tarafından da fırlatıldığı için RemoteException istisnasını atar) ve uyguladığı arabirim(ler)in yöntemlerini tanımlarız.
  • Son olarak, ana yöntemde, Naming sınıfını ve rebind(...) yöntemini kullanarak, paylaşmak istediğimiz uzak nesneyi oluşturmak ve uzak nesneyi istemcilere görünür kılmak için kodu tanımlarız.

Not: Kolaylık sağlamak için main() yöntemini aynı sınıfın içine koyduk. Uzak nesneyi kaydetmekten sorumlu olacak ayrı bir sınıf tanımlanabilir.

  • Sunucuyu derleyin ve çalıştırın

Sunucuyu zaten tanımladık. Şimdi aşağıdaki adımları kullanarak sınıflarınızı derlememiz gerekiyor:

    • Uzak arayüzü derliyoruz. Ek olarak, hem istemcide hem de sunucuda bulunmasını sağlamak için bir JAR dosyasında gruplandırıyoruz:
javac MyRemoteInterface.java
jar cvf objRemotes.jar MyRemoteInterface.class
    • Ardından, arayüzleri uygulayan sınıfları derliyoruz. Ve her biri için, rmic komutunu kullanarak uzak nesneye referansı korumak için Stub ve Skeleton dosyalarını oluşturuyoruz:
CLASSPATH=%CLASSPATH%;.\Remoteobj.jar; olarak ayarlayın.
javac MyRemoteClass.java
rmic -d . BenimUzakSınıfım

Çalışma dizinimizde, RMI mimarisinin saplama-iskelet katmanına karşılık gelen iki .class dosyasının (MiClaseRemota_Skel.class ve MiClaseRemota_Stub.class) otomatik olarak oluşturulduğunu görebiliriz.

  • Sunucuyu çalıştırmak için şu adımları izliyoruz:
    • Uzak nesnelerin günlüğe kaydedilmesine ve aranmasına izin vermek için RMI günlüğü başlatılır. Kayıt defteri, paylaşılacak bir dizi uzak nesneyi yönetmekten ve istemciler tarafından istendiğinde bunları aramakla sorumludur. İsteğe bağlı olarak bağlanmak için bağlantı noktasını geçirebileceğimiz Java ile dağıtılan rmiregistry uygulamasıyla çalışır (varsayılan olarak 1099).

Windows durumunda, yürütülmelidir:

kayıt defterini başlat 1234

Ve Linux durumunda:

rmiregistry &
    • Son olarak, sunucu başlatılır:
java -Djava.rmi.server.hostname=127.0.0.1 MyRemoteClass 1234
  • Bir RMI istemcisi oluşturun

Şimdi oluşturduğumuz uzak nesne(ler)e erişecek bir istemci tanımlayacağız. Bunun için aşağıdaki adımları izliyoruz:

    • Gerekli uzak nesneleri almak için sınıfı tanımlayın

Aşağıdaki sınıf, sunucumuzda uygulanan MyRemoteInterface türünde bir nesne alır:

genel  sınıf  MyRMIClient 
{

 özel  MyRMIClient (){}; 

 public  static  void  main ( String []  args ) 
 { 
   try 
   { 
     MyRemoteInterface  mir  =  ( MyRemoteInterface ) Java . rmi . adlandırma . arama ( "rmi://"  +  
                             args [ 0 ]  +  ":"  +  args [ 1 ]  +  "/RMITest" );
     
     // myMethod1() öğesini, myMethod2() öğesinin 
     ( int i = 1 ; i <= myr . myMethod2 (); i ++ ) myr için döndürdüğü kadar yazdırın  . benimYöntem1 (); } yakalama ( İstisna e ) { e . printStackTrace (); } } }  
         
   
     
   
     
   
 

Gördüğünüz gibi, uzak makinenin RMI kayıt defterinde uzak nesneyi aramaktan ibarettir. Bunu yapmak için Adlandırma sınıfını ve onun arama(...) yöntemini kullanırız.

    • İstemciyi derleyin ve çalıştırın

İstemciyi zaten tanımladıktan sonra, onu derlemek için şunları yaparız:

CLASSPATH=%CLASSPATH%;.\Remoteobj.jar; olarak ayarlayın.
javac MyRMIClient.java

Ardından, istemciyi çalıştırmak için şunları yaparız:

java MyClientRMI 127.0.0.1 1234

Uzak sınıfın saplama dosyası erişilebilir olmalıdır. Bunu yapmak için, onu istemciye kopyalayıp CLASSPATH'ine dahil ederiz ya da sunucunun CLASSPATH'inden kaldırırız ve yolunu sunucunun java.rmi.codebase'ine ekleriz (sunucunun CLASSPATH'inden kaldırılmamışsa, java seçeneği. rmi.codebase ve istemci Stub'a erişemeyecek. RMI sunucusunun çalıştığı pencereye bir göz atarsak, uzak nesnenin nasıl bulunduğunu ve yöntemlerinin nasıl yürütüldüğünü göreceğiz:

Ayrıca

Dış bağlantılar