2. Konu Başlıkları
• Ön Çalışma
– ClassLoader (Yerel dosya, Ağ)
– Socket, Serialization
• RMI
– RMI Mimari
– RMI transient naming
– RMI bootstrap
– RMI serialization
– Dynamic RMI (http://docs.oracle.com/javase/1.4.2/docs/guide/rmi/codebase.html )
– Örnek RMI uygulama - sunucu tarafı giriş
– Örnek RMI uygulama - istemci tarafı giriş
– Örnek RMI uygulama - sunucu tarafı
– Örnek RMI uygulama - istemci tarafı
– Örnek RMI uygulama
• CORBA vs RMI
• CORBA
– CORBA services
– RMI ve CORBA güvenlik
– Gözden geçirme
– Örnek CORBA uygulama - sunucu tarafı giriş
– Örnek CORBA uygulama - istemci tarafı giriş
– Örnek CORBA uygulama - sunucu tarafı
– Örnek CORBA uygulama - istemci tarafı
– Örnek CORBA uygulam
• Kaynakça
3. Giriş
• Örnek Uygulamalar Eclipse/Netbeans
Uygulama geliştirme aracıyla yapılacaktır.
• Web server (RMI dynamic class loading)
• RMI eğitimi ve örnek uygulamalar
http://docs.oracle.com/javase/tutorial/rmi/index
deki açıklamalara göre yapılacaktır.
4. Kısaltmalar, Açıklamalar
JVM Java Virtual Machine
IDL Interface Definition Language
RRM (Remote Reference Manager) Ağ iletişimi, soket bağlantıları ve uzak
işlem uzaylarının iletişimini yönetir.
RRL Remote Reference Layer
RPC Remote Procedure Call (Uzak yordam çağrısı)
Sunucu (RMI server) Uzak Sanal makinada (JVM) koşan işlem
İstemci (RMI client) Uzak sanal makinaya rmi ile bağlanıp, uzaktan nesne üzerinde metod
çağrısı yapan program.
Kayıt Defteri (rmiregistry) RMI sunucu nesnelerinin kaydolduğu yer.
Skeleton Sunucuda uzak nesne metot çağrılarını yapar.
Stub İstemcide uzak nesne için proxy görevi görür.
IIOP Internet InterOperable Protocol, CORBA’nın iletişim protokolü.
ORB Object Request Broker
RMI-IIOP Programcı’nın OMG-IDL bilmeden CORBA yazmasını sağlar.
5. Ön Çalışma
• ClassLoader
– Java, gerekli olan sınıfları yükler,
bytecode’ları jvm çalıştırır.
– Java applet’lerde, ağdan sınıf yükleme özelliği
kullanılır.
– RMI kapsamında, dynamic loading ‘i ağdan
sınıf yüklemeye benzetebiliriz.
7. RMI Açıklama
• Dağıtık nesne modelleri:
– JVM1 JVM2 (RMI)
– Birlikte çalışabilirklik (Interoperability)
– Transparency: Java’nın bütün özellikleri (nesne, kalıtım, çok biçimlilik,
referanslar, aykırı durumlar) kullanılır.
• RMI Sun (Oracle) tarafından geliştirilmiş dağıtık nesne modelidir.
• RMI Özellikleri
– ORB
• Uygulama Arayüzlerini tanımlar
• Uygulamaları ağda arar ve bulur
• Uygulamların mesaj göndermesini ve sonucun alınmasını sağlar.
– Adlandırma Servisi (Naming Servis)
• Geçici ve hiyerarşisi olmayan bir tablo işlevi görür. Tabloda uzak nesnelerin
isimleri ve referansları bulunur: rmiregistry
– Arayüz Tanım Dili (IDL)
• interface java.rmi.Remote
– Dinamik sınıf yükleme
• RMI, java’nın “built-in native” ORB’sidir.
8. RMI transient naming
• RMI kayıt defteri
• Uzak nesnelerin, istemciler tarafından
kullanılması için, kendilerini bir registry’ye
kaydetmeleri gerekiyor.
• Kaydetme isim ve referans şeklinde bir
map’e (registry) kaydediliyor.
• Registry erişilebilir olmadığı durumlar
kayıtlı bütün uzak nesneler tekrar
kaydedilmeli.
9. RMI bootstrap
• RMI istemcinin uzak metodu çalıştıracak
stub’ı alması için gerekli olan mekanizma
– RMI Registry
– LDAP sunucu (JNDI), LDAP sağlayıcı
kullanarak
• RMI Registry, uzaktaki nesnenin kaydını
tutuyor (isim, ip, stub). İstemci registry’yi
isme göre sorgulayarak stub’ı alıyor.
10. RMI Mimari
• Uygulama Katmanı: Sunucu programı ve
istemci programı.
• Stub ve Skeleton Katmanı: İstemcide, uzak
nesne çağrılarını RRL’nin anlayacağı şekilde
yorumlar. (Proxy)
• RRL: İstemci ve sunucu’da bulunur. Bağlantıyı
yönetir, nesne çağrılarını gönderir veya alır.
• İletim (Transport) Katmanı: Ağdaki TCP/IP
bağlantıları.
11. RMI Mimari
Uzak Sınıf yükleme Uzak Sınıf yükleme
İstemci 2. Servis ara (lookup) Sunucu
RMI registry / JNDI
İstemci 3. Stub
nesneleri Sunucu 1. Stub yükle
nesneleri
4. Uzak nesnelerin metod çağrısı
Stub Skeleton
5. Sonuçlar veya Aykırı durum
RRM RRM
~Serialization
RMI Transport Katmanı RMI Transport Katmanı
12. RMI Mimari
RMI çalışma zamanında olanlar
• RMI registry başlatılır ve servis kaydedilir.
• İstemci servisi rmi registry’de arar.
• İstemci işlem uzayında servisin stub’ı elde edilir.
• İstemci, stub’da metodları çağırır. Stub, sunucu işlem havuzunda
RRM yardımıyla Skeletonu çağırır.
• Skeleton, uzak nesne üzerinde gerçek metod çağrısını yapar.
Sonuç, istemciye Stub ve RRM yardımıyla gönderilir.
4. ve 5. adımlar mantıksal olarak gösterilmiştir. Asıl işlem RRM
tarafından gerçekleştirilmektedir. Bu katman ağ iletişimini yönetir
ve soket bağlantılarını ele alır.
13. RMI serialization
• Serialization, java’nın özelliklerinden biridir.
Nesnenin (Serializable arayüzünü gerçekletiren
sınıftan türeyen) bir stream’e (dosya, soket,
bellek vb.) yazılmasını sağlar.
• Yazılan bir nesne, daha sonra tekrar işlem
hazunda bir nesne olarak yaratılabilir.
Uzak makinaya parametre olarak gönderilen
nesneler serialization işlemi yardımıyla gönderilir
ve sonuçlar serialization işlemi yardımıyla alınır.
14. Dynamic RMI
• ClassLoader (CLASSPATH, Ağ)
• Sınıf dosyaları (.class, jar) ağ’da biryerde
olabilir. ClassLoader yardımıyla sınıflar,
işlem havuzuna çalışma zamanında
alınabilir.
15. Java codebase
• JVM’ye sınıf tanımlarının yüklendiği yer
• JVM codebase’den sınıf tanımlarını
(özellikle uzak sınıflar) yükler
• CLASSPATH yerel codebase olarak
düşünülebilir.
16. Örnek RMI uygulama - Giriş
• Compute Engine uygulaması
• Arayüzler tanımlanacak
– Compute.java
• Sunucu tasarlanacak
– ComputeEngine.java
• İstemci tasarlanacak
– ComputeTask.java
• IDE’de üç tane proje tanımlanacak
Require Require
– rmi-interfaces
– rmi-server
– rmi-client
(Dosya, URL)
Sınıf Yükleme
SecurityManager
17. Örnek RMI uygulama - Sunucu
• Arayüz (rmi-interfaces)
public interface Compute extends Remote { <T> T executeTask(Task<T> t) throws
RemoteException;
}
public interface Task<T> {
T execute();
}
• Gerçekleştirim (rmi-server)
public class ComputeEngine implements Compute {
@Override
public <T> T executeTask(Task<T> t) throws RemoteException {
System.out.println("Executing " + t.name() + " :: " + new Date());
return t.execute();
}
}
18. Örnek RMI uygulama – Sunucu
(main)
• Sunucu main metot.
if (System.getSecurityManager() == null) {
System.setSecurityManager(new SecurityManager());
}
int port = Registry.REGISTRY_PORT;
if (args.length > 0) {port = Integer.parseInt(args[0]);}
try {
Compute engine = new ComputeEngine();
Compute stub = (Compute) UnicastRemoteObject.exportObject(engine, 0);
Registry registry = LocateRegistry.createRegistry(port);
System.out.println(String.format("RMI registry başladı, port: %d", port));
registry.rebind(NAME, stub);
for (String string : registry.list()) {
Remote remote = registry.lookup(string);
System.out.println(remote);
}
System.out.println("ComputeEngine bağlandı");
} catch (Exception e) {
e.printStackTrace();
}
19. Örnek RMI uygulama - İstemci
• Hangi Task? Pi’nin hesaplanması(rmi-client)
public class Pi implements Task<BigDecimal>, Serializable {
//ilklendirmeler
public BigDecimal execute() {
return computePi(digits);
}
public static BigDecimal computePi(int digits) { … }
}
20. Örnek RMI uygulama – İstemci
(main)
• İstemci main metot.
//ya da VM parametresi -Djava.security.manager
if (System.getSecurityManager() == null) {
System.setSecurityManager(new SecurityManager());
}
try {
Registry registry = LocateRegistry.getRegistry(args[0]);
Compute comp = (Compute) registry.lookup(name);
Pi task = new Pi(Integer.parseInt(args[1]));
BigDecimal pi = comp.executeTask(task);
System.out.println(pi);
} catch (Exception e) {
e.printStackTrace();
}
21. Derleme ve Çalıştırma
• Derlerme
– Eclipse çalışma ortamında üç proje var; interfaces, server, client.
• server ve client projeleri interfaces projesini required olarak
eklemeliler derlenmesi için.
• interfaces projesi ve client projesi için interfaces.jar ve client.jar
oluşturup web sunucudaki erişilmesi izne tabi olmayan bir yerde
yayınlayalım.
• Çalıştırma
– VM parametreleri
• -Djava.security.policy=server.policy
• -Djava.rmi.server.codebase=“http://ip:port/interface.jar http://ip:port/hibernate4/client.jar”
• -Djava.rmi.server.hostname=ip
• İstemci
– VM parametreleri
• -Djava.security.policy=server.policy
• -Djava.rmi.server.codebase=http://ip:port/interface.jar
• -Djava.rmi.server.hostname=ip
NOT: Oracle’ın eğitim dokümanlarındaki anlatımlar Eclipse geliştirme aracı olmadan
yapılan ve rmi dinamik yüklemesinin aynı sunucu üzerinde dosya sistemi üzerinden
yapılan anlatımlardır. Geliştiriciler dokümanlardaki anlatımları yapabilirler.
22. RMI Güvenlik (java 1.2 +)
• SecurityManager
if (System.getSecurityManager() == null) {
System.setSecurityManager(new SecurityManager());
}
Veya
-Djava.security.manager
• Policy
• Policy dosyaları .policy
23. CORBA vs RMI
CORBA ve RMI teknolojilerini karşılaştırmak, corba, rmi’dan iyidir demek gerçekçi
bir yöntem olmayacaktır. Onun yerine her iki standardın da olumlu ve olumsuz
yönlerini tablo şeklinde göstereceğiz.
RMI Olumlu Yönler RMI Olumsuz Yönler
Birden çok platforma taşınabilir. Platformlarda JVM çalışmalı.
Uzak sanal makinelere yeni sınıflar Uzak yordam çağrısında güvenlik kaygısı,
yüklenebilir. İki taraf da java olduğu için kullanımı kısıtlıyor.
java’nın bütün özellikleri kullanılabilir.
Geliştiriciler aşinalar. JDK1.02’den beri RMI deneyimine sahip olmayan geliştiriciler
kütüphanede. için öğrenme süreci CORBA ile
karşılaştırılabilir.
Varolan sistemler RMI kullanabilir. Zaman JVM çalışan sistemlerde kullanılabilir. Java
ve maliyet kazancı sağlanır. dışında yazılan diğer programlama dilleriyle
(C++, Ada, Cobol vd.) çalışan sistemlerle
konuşamaz.
24. CORBA vs RMI
CORBA Olumlu Yönler CORBA Olumsuz Yönler
Servisler birden çok programlama dilinde IDL öğrenilmeli.
geliştirilebilir ve “IDL mapping” ile değişik http://www.omg.org/gettingstarted/omg_idl.htm
programlama diliyle geliştirilen sistemlerden
erişilebilir.
IDL yardımıyla arayüzler, geliştirimden IDLKaynak kodu araçları mevcuttur. Bazı
tamamen bağımsız hale getirilmiştir. araçlar IDL değişiklikleri uyumlu
olmayabilir.
Birçok veri yapısını destekler. Parametrik Sistemler arasında nesneler veya kod
olarak sistemler arasında iletişimi sağlar. transfer edilmez.
Geleceği belirsiz.
CORBA sistemleri (nesneler) Eğitim gereklidir. CORBA Belirtimleri
konuşturmanın kolay yoludur. devamlı değişiyor.
Performansı yüksektir. Performans gerekmeyen çok durum olabilir.
Belki java ile yazılan sistemlerin
kullanımının maliyet düşüklüğü daha
geçerli olabilir.
25. Muhtemel Hatalar
java.rmi.ConnectIOException: error during JRMP connection establishment; nested exception is:
java.net.SocketException: Connection reset
at sun.rmi.transport.tcp.TCPChannel.createConnection(TCPChannel.java:286)
at sun.rmi.transport.tcp.TCPChannel.newConnection(TCPChannel.java:184)
at sun.rmi.server.UnicastRef.newCall(UnicastRef.java:322)
at sun.rmi.registry.RegistryImpl_Stub.rebind(Unknown Source)
at compute.ComputeEngine.main(ComputeEngine.java:29)
•rmiregistry başlatılmamış olabilir. LocateRegistry.createRegistry(1099);
•İstemci’nin aradığı rmi sunucu bulunamamış olabilir.
•RMI sunucu var olabilir fakat remote object kayıtlı değildir.
•RMI sunucu, girilen ip ve portta çalışmıyordur.
java.rmi.UnmarshalException: Error unmarshaling return header; nested exception is:
java.io.EOFException
at sun.rmi.transport.StreamRemoteCall.executeCall(StreamRemoteCall.java:209)
at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:142)
at java.rmi.server.RemoteObjectInvocationHandler.invokeRemoteMethod(RemoteObjectInvocationHandler.java:178)
at java.rmi.server.RemoteObjectInvocationHandler.invoke(RemoteObjectInvocationHandler.java:132)
at $Proxy0.executeTask(Unknown Source)
at client.ComputeTask$1.run(ComputeTask.java:47)
at java.lang.Thread.run(Thread.java:619)
Caused by: java.io.EOFException
at java.io.DataInputStream.readByte(DataInputStream.java:250)
at sun.rmi.transport.StreamRemoteCall.executeCall(StreamRemoteCall.java:195)
Rmi sunucu’da izin olmayabilir (.policy dosyasındaki permission)