java 6 (rmi-corba) education
-
Upload
m-sinan-sahin -
Category
Technology
-
view
599 -
download
2
description
Transcript of java 6 (rmi-corba) education
Java SE 6 RMI-CORBA Eğitimi
Mehmet Sinan Şahin
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
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.html deki açıklamalara göre yapılacaktır.
Kısaltmalar, AçıklamalarJVM 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.
Ö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.
ClassLoader URL-tabanlı Sınıf Yükleme
StreamClassLoader
•Hashtable classCache •InputStream source
•parseClassName•initStream •readClass•loadClass
URLClassLoader
•URL classURL •InputStream classStream
ClassLoader
•defineClass•resolveClass
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.
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.
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.
• 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ı.
RMI Mimari
RMI Mimari
İstemci nesneleri
Stub
RRM
Sunucu nesneleri
Skeleton
RRM
RMI Transport KatmanıRMI Transport Katmanı
2. Servis ara (lookup)
3. Stub
4. Uzak nesnelerin metod çağrısı
İstemci Sunucu
RMI registry / JNDI
1. Stub yükle
5. Sonuçlar veya Aykırı durum
~Serialization
Uzak Sınıf yükleme Uzak Sınıf yükleme
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.
RMI Mimari
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.
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.
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.
Ö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
– rmi-interfaces– rmi-server– rmi-client
Require Require
(Dosya, URL)Sınıf
YüklemeSecurityManager
Ö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();
}
}
Ö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();
}
Ö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) { … }
}
Ö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();
}
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.
RMI Güvenlik (java 1.2 +)
• SecurityManagerif (System.getSecurityManager() == null) {
System.setSecurityManager(new SecurityManager());
}
Veya
-Djava.security.manager
• Policy
• Policy dosyaları .policy
CORBA vs RMI
RMI Olumlu Yönler RMI Olumsuz Yönler
Birden çok platforma taşınabilir. Platformlarda JVM çalışmalı.
Uzak sanal makinelere yeni sınıflar yüklenebilir. İki taraf da java olduğu için java’nın bütün özellikleri kullanılabilir.
Uzak yordam çağrısında güvenlik kaygısı, kullanımı kısıtlıyor.
Geliştiriciler aşinalar. JDK1.02’den beri kütüphanede.
RMI deneyimine sahip olmayan geliştiriciler için öğrenme süreci CORBA ile karşılaştırılabilir.
Varolan sistemler RMI kullanabilir. Zaman ve maliyet kazancı sağlanır.
JVM çalışan sistemlerde kullanılabilir. Java dışında yazılan diğer programlama dilleriyle (C++, Ada, Cobol vd.) çalışan sistemlerle konuşamaz.
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.
CORBA vs RMICORBA Olumlu Yönler CORBA Olumsuz Yönler
Servisler birden çok programlama dilinde geliştirilebilir ve “IDL mapping” ile değişik programlama diliyle geliştirilen sistemlerden erişilebilir.
IDL öğrenilmeli. http://www.omg.org/gettingstarted/omg_idl.htm
IDL yardımıyla arayüzler, geliştirimden tamamen bağımsız hale getirilmiştir.
IDLKaynak kodu araçları mevcuttur. Bazı araçlar IDL değişiklikleri uyumlu olmayabilir.
Birçok veri yapısını destekler. Parametrik olarak sistemler arasında iletişimi sağlar.
Sistemler arasında nesneler veya kod transfer edilmez.Geleceği belirsiz.
CORBA sistemleri (nesneler) konuşturmanın kolay yoludur.
Eğitim gereklidir. CORBA Belirtimleri 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.
Muhtemel Hatalar
•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.ConnectIOException: error during JRMP connection establishment; nested exception is: java.net.SocketException: Connection resetat 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)
Rmi sunucu’da izin olmayabilir (.policy dosyasındaki permission)
java.rmi.UnmarshalException: Error unmarshaling return header; nested exception is: java.io.EOFExceptionat 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.EOFExceptionat java.io.DataInputStream.readByte(DataInputStream.java:250)at sun.rmi.transport.StreamRemoteCall.executeCall(StreamRemoteCall.java:195)
Kaynakça
• http://docs.oracle.com/javase/tutorial/rmi/index.html• http://www.omg.org• http://docs.oracle.com/javase/1.4.2/docs/guide/rmi/codebase.html
• Proxy[Compute,RemoteObjectInvocationHandler[UnicastRef [liveRef: [endpoint:[10.251.100.80:50156](remote),objID:[494fa0d7:13af4825ddd:-7fff, -1623847688485003247]]]]]