Mengakses EJB secara Remote

Posted on June 3rd, 2009 | by endy |

Mengakses EJB secara Remote

Beberapa buku tentang EJB, seperti EJB 3 in Action karangan Reza Rahman maupun Enterprise Java Beans 3.0 karangan Bill Burke, membahas secara detail tentang penggunaan EJB. Akan tetapi, ada satu hal kecil namun penting yang tidak dibahas. Bagaimana cara mengakses EJB secara remote?

Di sisi server, ini mudah. Cukup membuat remote interface saja beres. Tapi bagaimana cara lookupnya dari client? Artikel ini akan membahas cara memanggil EJB dari method main.

Sebelumnya, berikut adalah EJB yang akan kita panggil.

HaloBean.java

package com.artivisi.belajar.ejb.session;

@Stateless
public class HaloBean implements HaloRemote {
   public String halo(String nama) {
     return "Halo "+nama;
   }
}

HaloRemote.java

package com.artivisi.belajar.ejb.session;

@Remote
public interface HaloRemote {
   public String halo(String nama);
}

EJB ini akan kita deploy ke Glassfish menggunakan Netbeans. Bagaimana caranya? Silahkan buka menu Help Netbeans.

Berikut adalah kode untuk memanggil HaloBean secara remote.

HaloClient.java

package com.artivisi.belajar.ejb.client;

public class HaloClient {
  public static void main(String[] args){
    // 0. Konfigurasi host dan port
    String ejbHost = "localhost";
    String ejbPort = 12345;
    String ejbName = HaloRemote.class.getName();

    // 1. JNDI Context
    Properties props = new Properties();
    props.put("org.omg.CORBA.ORBInitialHost", ejbHost);
    props.put("org.omg.CORBA.ORBInitialPort", ejbPort);

    InitialContext ctx = new InitialContext(props);

    // 2. Lookup EJB
    HaloRemote haloBean = (HaloRemote) ctx.lookup(ejbName);

    // 3. Panggil methodnya
    System.out.println("Halo EJB : "+haloBean.halo("endy"));
  }
}

Ada beberapa variabel yang perlu diperhatikan di sini, yaitu ejbHost, ejbPort, dan ejbName. Variabel ejbHost tentunya adalah komputer tempat EJB dideploy. Variabel ejbPort adalah port yang digunakan oleh Application Server untuk mempublish EJB. Port ini berbeda-beda tergantung merek application server dan cara deploymentnya. Karena saya menggunakan Netbeans untuk mendeploy ke Glassfish, maka saya harus cari tahu dulu berapa port yang digunakan Netbeans.

Caranya, login ke admin console Glassfish melalui Netbeans. Buka tab Services, klik kanan Glassfish, dan pilih View Admin Console.

Glassfish Admin Console via Netbeans

Glassfish Admin Console via Netbeans


Browser akan terbuka dan menampilkan halaman login Glassfish.
Login Screen Glassfish

Login Screen Glassfish


Setelah login, klik Application Server di panel kiri. Port yang digunakan akan ditampilkan di panel kanan, yaitu dengan nama IIOP Port(s). Coba-coba saja semuanya. Di komputer saya, port yang benar adalah 10275.
Port IIOP Glassfish

Port IIOP Glassfish


Variabel ejbName juga berbeda tergantung dari application server yang digunakan. Baca dokumentasi server Anda untuk memastikannya.

  1. 4 Responses to “Mengakses EJB secara Remote”

  2. By Ziyad on Jun 11, 2009 | Reply

    Pak,

    untuk codingan yang di file HaloClient.java dan di baris 15, yang ini ->
    InitialContext ctx = new InitialContext(ctx);

    kok error pak..??

    apa di ganti seperti ini?? ->
    InitialContext ctx = new InitialContext(props);

  3. By endy on Jun 11, 2009 | Reply

    Oh iya … sori lupa ;p.
    Thx atas koreksinya

  4. By Rikky Hasibuan on Jan 14, 2010 | Reply

    Pak Endy, bantuin saya dong.

    Bagaimana caranya meng-konfigurasi NetBeans dan GlassFish agar JNDI name bean saya dikenalin(tidak menggunakan annotation @EJB lagi)???

    Saya sudah buatkan jndi.properties yang berisi:
    ====
    # To change this template, choose Tools | Templates
    # and open the template in the editor.
    java.naming.factory.initial = com.sun.enterprise.naming.SerialInitContextFactory
    java.naming.factory.url.pkgs = com.sun.enterprise.naming
    java.naming.factory.state = com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl

    #optional. Defaults to localhost. Only needed if web server is running
    #on a different host than the appserver
    org.omg.CORBA.ORBInitialHost = localhost
    #optional. Defaults to 3700. Only needed if target orb port is not 3700.
    org.omg.CORBA.ORBInitialPort = 3700
    ====

    Namun saat dijalankan menggunakan program ini:
    ===
    public class Main {
    public static void main(String[] args) throws Exception {
    Properties props = new Properties();
    props.load(new FileInputStream(“jndi.properties”));
    InitialContext ctx = new InitialContext(props);
    TestEJBRemote testEJB = (TestEJBRemote) ctx.lookup(“stateless.TestEJBRemote”);
    System.out.println(testEJB.getMessage());
    }
    }
    ====

    Muncul error:
    ====
    Exception in thread “main” javax.naming.NoInitialContextException: Cannot instantiate class: com.sun.enterprise.naming.SerialInitContextFactory [Root exception is java.lang.ClassNotFoundException: com.sun.enterprise.naming.SerialInitContextFactory]
    at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:657)
    at javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:288)
    at javax.naming.InitialContext.init(InitialContext.java:223)
    at javax.naming.InitialContext.(InitialContext.java:197)
    at javaapplication8.Main.main(Main.java:17)
    Caused by: java.lang.ClassNotFoundException: com.sun.enterprise.naming.SerialInitContextFactory
    at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
    ===

    Mohon Bantuannya Pak….!!!

  5. By Endy Muhardin on Jan 27, 2010 | Reply

    Saya jarang coding EJB, jadi gak bisa jawab. Coba tanyakan di milis Netbeans atau JUG.

Post a Comment