Java Uzak Yöntem Çağırma
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
- Basit RMI Örneği
- Sun Microsystems'den Java RMI öğreticisi Eğitimi (İngilizce)
- İz: RMI Java RMI Resmi Belgeleri
- RMI Uygulamalarına Genel Bir Bakış Java RMI Uygulamalarına Resmi Giriş