Kısa EJB Eğitimi: Netbeans’de EJB Geliştirme – II: SE İstemcisi

Dün yazdığım yazıda Netbeans üzerinde SelamEJB isimli bir EJB projesi geliştirmiş ve içinde de Selam isimli bir session bean koymuştuk. Selam session beanimizin iki metotu vardı, birini SelamLocal isimli yerel arayüzden diğerini de SelamRemote isimli uzak arayüzden devralıyordu. SelamEJB projesini de Glassfish’e başarıyla kurmuştuk. Bu yazıda ise Selam beanine Java SE ortamından ulaşan basit bir istemci yazacağız. Bu amaçla Netbeans üzerinde önce SelamEJBClient isimli bir Java projesi oluşturalım. Bunun için Netbeans’in solundaki Project sekmesine sağ tık => New Project yapıp çıkan pencerede Categories kısmında Java‘yı, Projects kısmında ise Java Application‘u seçin ve Next‘i tıklayın. Şimdi çıkan pencerede ise projenin ismini SelamEJBClient olarak koyun ve aşağıdaki gibi bir ayarla Finish‘i tıklayın.

EJBSEClient2

Şimdi de SelamEJBClient projesinde main metota sahip SelamClient isimli bir Java snıfı yaratalım. Bu sınıfta yapacağımız şeyler, önce Glassfish’in JNDI’ına bağlanmak, sonra Selam session beaninin uzak arayüzüne, SelamRemote, ulaşmak ve en son olarak da elde ettiğimiz uzak arayüz üzerindeki metotu çağırmak. Glassfish’in JNDI’ına bağlanmak demek, InitialContext nesnesini oluşturmak demektir. İstemcimiz Glassfish içinde çalışmayacağından ona sunucuya ulaşabilmesi için gerekli bilgileri geçmeliyiz. Bu durumda aşağıdaki gibi bir koda sahip oluruz:

public void initialize() {
   Properties p = new Properties();
   p.setProperty("java.naming.factory.initial",
      "com.sun.enterprise.naming.SerialInitContextFactory");
   p.setProperty("java.naming.factory.url.pkgs",
      "com.sun.enterprise.naming");
   p.setProperty("java.naming.factory.state",
      "com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl");
   p.setProperty("org.omg.CORBA.ORBInitialHost", "localhost");
   p.setProperty("org.omg.CORBA.ORBInitialPort", "3700");</code>

   try {
      ctx = new InitialContext(p);
   } catch (NamingException e) {
      System.out.println("Problem: " + e.getMessage());
      e.printStackTrace();
   }
}

Yukarıdaki kodda, localhost‘ta çalışan Glassfish‘in 3700 nolu portunu dinleyen IIOP listener‘ına bağlanarak, Glassfish’in JNDI’ına ulaşmış olduk. Bu arada unutmadan şu iki şeyi de söyleyelim: İstemcimizim çalışabilmesi için koddan da anlaşılacağı üzere Selam beaninin arayüzleriyle Glassfish’in JNDI’ına ulaşmak için gerekli sınıflara ihtiyacı vardır. Bu amaçla istemcinin classpathine, SelamEJB projesini ve Glassfish’in ilgili jar dosyasını koymalıyız. Bu amaçla SelamEJBClient projesin üzerinde sağ tık => Properties => Libraries‘e gidin ve Add Project ile SelamEJB projesini, Add Jar/Folder ile de Glassfish’i kurduğunuz yerdeki glassfish\lib klasörünün altındaki appserv-rt.jar‘ı ekleyin. Bu durumda SelamEJBClient projesinin classpathine hem SelamEJB.jar hem de Glassfish’in istemci jar dosyası eklenmiş oldu.

Şimdi de elde ettiğimiz JNDI ortamında ki InitialContext nesnesiyle ifade ediliyor, Selam beanimizin uzak arayüzü olan SelamRemote nesnesini bulalım. SelamRemote nesnesini alabilmek için, bu nesnenin JNDI ismine ihtiyacımız var. Bu isimlendirme konusu daha önceleri çok da taşınamaz bir şekilde, uygulama sunucuları tarafından kendilerine has bir yöntemle oluşturuluyordu. EJB 3.1 ile birlikte bir başka yazımda da belirttiğim şekilde çözüme kavuştu. Bizde bu ismi InitialContext nesnesinin lookup metotuna geçerek nesnemize ulaşacağız. Sonra da bu nesne üzerindeki selamSoyleRemote metotunu bir String nesnesi geçerek çağıralım:

   public void start(){
      try {
         selam = (SelamRemote) ctx.lookup("java:global/SelamEJB/Selam!selam.SelamRemote");
      } catch (NamingException ex) {
         Logger.getLogger(SelamClient.class.getName()).log(Level.SEVERE, null, ex);
      }

      String cevap = selam.selamSoyleRemote("Akin");
      System.out.println(cevap);
   }

 

Ve gelen cevap:

   Selam Akin from remote.

Yukarıdaki kodda neden uzak arayüzü aldık, yani SelamRemote nesnesine ulaştık ta yerel nesneyi yani SelamLocal’ı almadık. Bir deneyin bakalım, aşağıdaki gibi bir kodla yerel arayüze ulaşabilecek misniz?

public void start(){
   try {
      selam = (SelamLocal) ctx.lookup("java:global/SelamEJB/Selam!selam.SelamLocal");
   } catch (NamingException ex) {
      Logger.getLogger(SelamClient.class.getName()).log(Level.SEVERE, null, ex);
   }

   String cevap = selam.selamSoyleLocal("Akin");
   System.out.println(cevap);
}

 

Bu durumda Glassfish hata verecek ve yerel arayüzü size geri döndürmeyecektir, çünkü siz beanin ancak uzak arayüzüne ulaşabilirsiniz. Yerel arayüze nasıl ulaşacağımızı ise bir sonraki yazıda göreceğiz.

İstemci kodu:

package client;

import java.util.Properties;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import selam.SelamLocal;
import selam.SelamRemote;

public class SelamClient {

   private InitialContext ctx;
   private SelamRemote selam;
   // private SelamLocal selam;

   public static void main(String[] args) {
      SelamClient client = new SelamClient();
      client.initialize();
      client.start();
   }

   public void start(){
      try {
         selam = (SelamRemote) ctx.lookup("java:global/SelamEJB/Selam!selam.SelamRemote");
         //selam = (SelamLocal) ctx.lookup("java:global/SelamEJB/Selam!selam.SelamLocal");
      } catch (NamingException ex) {
         Logger.getLogger(SelamClient.class.getName()).log(Level.SEVERE, null, ex);
      }

      String cevap = selam.selamSoyleRemote("Akin");
      //String cevap = selam.selamSoyleLocal("Akin");
      System.out.println(cevap);
   }

   public void initialize() {
      Properties p = new Properties();
      p.setProperty("java.naming.factory.initial",
         "com.sun.enterprise.naming.SerialInitContextFactory");
      p.setProperty("java.naming.factory.url.pkgs",
         "com.sun.enterprise.naming");
      p.setProperty("java.naming.factory.state",
         "com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl");
      p.setProperty("org.omg.CORBA.ORBInitialHost", "localhost");
      p.setProperty("org.omg.CORBA.ORBInitialPort", "3700");

      try {
         ctx = new InitialContext(p);
      } catch (NamingException e) {
         System.out.println("Problem: " + e.getMessage());
         e.printStackTrace();
      }
   }
}

Bu yazı toplam 1323 defa görüntülenmiştir.