SlideShare ist ein Scribd-Unternehmen logo
1 von 27
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
  deki açıklamalara göre yapılacaktır.
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.
Ö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
                                        ClassLoader

                                        •defineClass
                                        •resolveClass




                                     StreamClassLoader


          URLClassLoader          •Hashtable classCache
                                  •InputStream source
       •URL classURL
       •InputStream classStream   •parseClassName
                                  •initStream
                                  •readClass
                                  •loadClass
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.
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ı.
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ı
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.
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
                                      Require                   Require
   – rmi-interfaces
   – rmi-server
   – rmi-client

                                                (Dosya, URL)
                                                Sınıf Yükleme
                                                SecurityManager
Ö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 +)
• SecurityManager
  if (System.getSecurityManager() == null) {
    System.setSecurityManager(new SecurityManager());
  }
  Veya
  -Djava.security.manager


• Policy
• Policy dosyaları .policy
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.
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       IDLKaynak 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.
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)
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,RemoteObjectInvocationH
  andler[UnicastRef [liveRef: [endpoint:
  [10.251.100.80:50156](remote),objID:
  [494fa0d7:13af4825ddd:-7fff,
  -1623847688485003247]]]]]

Weitere ähnliche Inhalte

Ähnlich wie java 6 (rmi-corba) education

Rails İle Ağ Uygulamaları Geliştirimi
Rails İle Ağ Uygulamaları GeliştirimiRails İle Ağ Uygulamaları Geliştirimi
Rails İle Ağ Uygulamaları Geliştirimimuarifer
 
Siber Guvenlik ve Etik Hhacking -2-
Siber Guvenlik ve Etik Hhacking -2-Siber Guvenlik ve Etik Hhacking -2-
Siber Guvenlik ve Etik Hhacking -2-Murat KARA
 
C++ sitesi
C++ sitesiC++ sitesi
C++ sitesisersld30
 
C++ dokumani
C++ dokumaniC++ dokumani
C++ dokumanisersld29
 
C++ semineri
C++ semineriC++ semineri
C++ seminerisersld30
 
Symfony2 ve Doctrine ile PostgreSQL'i Kullanarak Performanslı Mimari Oluşturma
Symfony2 ve Doctrine ile PostgreSQL'i Kullanarak Performanslı Mimari OluşturmaSymfony2 ve Doctrine ile PostgreSQL'i Kullanarak Performanslı Mimari Oluşturma
Symfony2 ve Doctrine ile PostgreSQL'i Kullanarak Performanslı Mimari OluşturmaHüseyin Mert
 
Siber Güvenlik Buluşmaları 7. oturum, 1. kısım-07.12.2013
Siber Güvenlik Buluşmaları 7. oturum, 1. kısım-07.12.2013Siber Güvenlik Buluşmaları 7. oturum, 1. kısım-07.12.2013
Siber Güvenlik Buluşmaları 7. oturum, 1. kısım-07.12.2013Siber Güvenlik Derneği
 
2010 Kocaeli Linux Günleri - Linux Web Geliştiriciliği
2010 Kocaeli Linux Günleri - Linux Web Geliştiriciliği2010 Kocaeli Linux Günleri - Linux Web Geliştiriciliği
2010 Kocaeli Linux Günleri - Linux Web GeliştiriciliğiBurak Oğuz
 
Nginx ve Unicorn'la Rack Uygulamalarını Koşturmak
Nginx ve Unicorn'la Rack Uygulamalarını KoşturmakNginx ve Unicorn'la Rack Uygulamalarını Koşturmak
Nginx ve Unicorn'la Rack Uygulamalarını KoşturmakUğur Özyılmazel
 
Php kursu-sakarya
Php kursu-sakaryaPhp kursu-sakarya
Php kursu-sakaryasersld88
 
C sharp-indir
C sharp-indirC sharp-indir
C sharp-indirsersld30
 
Java me kursu-ankara
Java me kursu-ankaraJava me kursu-ankara
Java me kursu-ankarasersld61
 
Php testleri
Php testleriPhp testleri
Php testlerisersld89
 
C++ hocasi
C++ hocasiC++ hocasi
C++ hocasisersld30
 

Ähnlich wie java 6 (rmi-corba) education (20)

Rails İle Ağ Uygulamaları Geliştirimi
Rails İle Ağ Uygulamaları GeliştirimiRails İle Ağ Uygulamaları Geliştirimi
Rails İle Ağ Uygulamaları Geliştirimi
 
Uygulamali Sizma Testi (Pentest) Egitimi Sunumu - 2
Uygulamali Sizma Testi (Pentest) Egitimi Sunumu - 2Uygulamali Sizma Testi (Pentest) Egitimi Sunumu - 2
Uygulamali Sizma Testi (Pentest) Egitimi Sunumu - 2
 
Siber Guvenlik ve Etik Hhacking -2-
Siber Guvenlik ve Etik Hhacking -2-Siber Guvenlik ve Etik Hhacking -2-
Siber Guvenlik ve Etik Hhacking -2-
 
Netty Tanıtımı
Netty TanıtımıNetty Tanıtımı
Netty Tanıtımı
 
C++ sitesi
C++ sitesiC++ sitesi
C++ sitesi
 
C++ dokumani
C++ dokumaniC++ dokumani
C++ dokumani
 
C++ semineri
C++ semineriC++ semineri
C++ semineri
 
Symfony2 ve Doctrine ile PostgreSQL'i Kullanarak Performanslı Mimari Oluşturma
Symfony2 ve Doctrine ile PostgreSQL'i Kullanarak Performanslı Mimari OluşturmaSymfony2 ve Doctrine ile PostgreSQL'i Kullanarak Performanslı Mimari Oluşturma
Symfony2 ve Doctrine ile PostgreSQL'i Kullanarak Performanslı Mimari Oluşturma
 
Siber Güvenlik Buluşmaları 7. oturum, 1. kısım-07.12.2013
Siber Güvenlik Buluşmaları 7. oturum, 1. kısım-07.12.2013Siber Güvenlik Buluşmaları 7. oturum, 1. kısım-07.12.2013
Siber Güvenlik Buluşmaları 7. oturum, 1. kısım-07.12.2013
 
Komut satırı JAVA
Komut satırı JAVAKomut satırı JAVA
Komut satırı JAVA
 
2010 Kocaeli Linux Günleri - Linux Web Geliştiriciliği
2010 Kocaeli Linux Günleri - Linux Web Geliştiriciliği2010 Kocaeli Linux Günleri - Linux Web Geliştiriciliği
2010 Kocaeli Linux Günleri - Linux Web Geliştiriciliği
 
C++ odevi
C++ odeviC++ odevi
C++ odevi
 
Nginx ve Unicorn'la Rack Uygulamalarını Koşturmak
Nginx ve Unicorn'la Rack Uygulamalarını KoşturmakNginx ve Unicorn'la Rack Uygulamalarını Koşturmak
Nginx ve Unicorn'la Rack Uygulamalarını Koşturmak
 
Java EE Struts
Java EE StrutsJava EE Struts
Java EE Struts
 
Php kursu-sakarya
Php kursu-sakaryaPhp kursu-sakarya
Php kursu-sakarya
 
C sharp-indir
C sharp-indirC sharp-indir
C sharp-indir
 
Java me kursu-ankara
Java me kursu-ankaraJava me kursu-ankara
Java me kursu-ankara
 
C++ indir
C++ indirC++ indir
C++ indir
 
Php testleri
Php testleriPhp testleri
Php testleri
 
C++ hocasi
C++ hocasiC++ hocasi
C++ hocasi
 

java 6 (rmi-corba) education

  • 1. Java SE 6 RMI-CORBA Eğitimi Mehmet Sinan Şahin
  • 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.
  • 6. ClassLoader URL-tabanlı Sınıf Yükleme ClassLoader •defineClass •resolveClass StreamClassLoader URLClassLoader •Hashtable classCache •InputStream source •URL classURL •InputStream classStream •parseClassName •initStream •readClass •loadClass
  • 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 IDLKaynak 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)
  • 26. 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
  • 27. • Proxy[Compute,RemoteObjectInvocationH andler[UnicastRef [liveRef: [endpoint: [10.251.100.80:50156](remote),objID: [494fa0d7:13af4825ddd:-7fff, -1623847688485003247]]]]]