java 6 (rmi-corba) education

27
Java SE 6 RMI-CORBA Eğitimi Mehmet Sinan Şahin

description

Java 6 rmi education in Turkish

Transcript of java 6 (rmi-corba) education

Page 1: java 6 (rmi-corba) education

Java SE 6 RMI-CORBA Eğitimi

Mehmet Sinan Şahin

Page 2: java 6 (rmi-corba) education

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

Page 3: java 6 (rmi-corba) education

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.

Page 4: java 6 (rmi-corba) education

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.

Page 5: java 6 (rmi-corba) education

Ö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.

Page 6: java 6 (rmi-corba) education

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

Page 7: java 6 (rmi-corba) education

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.

Page 8: java 6 (rmi-corba) education

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.

Page 9: java 6 (rmi-corba) education

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.

Page 10: java 6 (rmi-corba) education

• 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

Page 11: java 6 (rmi-corba) education

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

Page 12: java 6 (rmi-corba) education

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

Page 13: java 6 (rmi-corba) education

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.

Page 14: java 6 (rmi-corba) education

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.

Page 15: java 6 (rmi-corba) education

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.

Page 16: java 6 (rmi-corba) education

Ö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

Page 17: java 6 (rmi-corba) education

Ö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();

}

}

Page 18: java 6 (rmi-corba) education

Ö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();

}

Page 19: java 6 (rmi-corba) education

Ö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) { … }

}

Page 20: java 6 (rmi-corba) education

Ö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();

}

Page 21: java 6 (rmi-corba) education

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.

Page 22: java 6 (rmi-corba) education

RMI Güvenlik (java 1.2 +)

• SecurityManagerif (System.getSecurityManager() == null) {

System.setSecurityManager(new SecurityManager());

}

Veya

-Djava.security.manager

• Policy

• Policy dosyaları .policy

Page 23: java 6 (rmi-corba) education

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.

Page 24: java 6 (rmi-corba) education

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.

Page 25: java 6 (rmi-corba) education

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)

Page 26: java 6 (rmi-corba) education

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

Page 27: java 6 (rmi-corba) education

• Proxy[Compute,RemoteObjectInvocationHandler[UnicastRef [liveRef: [endpoint:[10.251.100.80:50156](remote),objID:[494fa0d7:13af4825ddd:-7fff, -1623847688485003247]]]]]