Call Stateless Remote EJB Cross JVM (Glassfish)

วันนี้มาทดสอบการเรียก remote ejb โดยใช้ java application ธรรมดาซึ่งไม่ได้อยู่บน context ของ application server เป็น standalone นั่นเอง
มาดู code การ initial context ก่อนเลย อันนี้ ทำกับ server ที่เป็น glassfish นะครับ

import java.util.Properties;
import javax.naming.InitialContext;

public class ContextFactory {

    public static InitialContext getContext() {
        Properties props = new Properties();
        props.setProperty("java.naming.factory.initial", "com.sun.enterprise.naming.SerialInitContextFactory");
        props.setProperty("java.naming.factory.url.pkgs", "com.sun.enterprise.naming");
        props.setProperty("java.naming.factory.state", "com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl");

        props.setProperty("org.omg.CORBA.ORBInitialHost", "localhost");
        props.setProperty("org.omg.CORBA.ORBInitialPort", "3700");

        System.out.println("=============================================================");
        System.out.println("EJB From " + props.getProperty("org.omg.CORBA.ORBInitialHost"));
        System.out.println("=============================================================");

        try {
            return new InitialContext(props);
        } catch (Exception e) {
            e.printStackTrace(System.out);
            return null;
        }
    }
}

มาดูกันต่อว่า “org.omg.CORBA.ORBInitialPort”, “3700” มันมาจากไหน และจะไปรู้ได้อย่างไรว่า glassfish เราใช้ port อะไรวะ
ซึ่งเข้าไปกำหนดค่า port ที่รอฟังการเรียกได้ โดยต้องเข้าไปที่ admin console ก่อนนะครับ แล้วไป่ต่อที่

Configuration->ORB->IIOP Listeners->orb-listener-1->Listener Port: 3700
ซึ่งต้องไปกำหนดที่ config ของinstance ที่ deploy ejb session bean ไว้นะครับ

จากนั้นก็ทดสอบเรียกครับ สมมติจะเรียก Class: CarManagerRemote Method:login(username):String

CarManagerRemote cmRemote = (CarManagerRemote) ContextFactory.getContext().lookup(CarManagerRemote.class.getName());
String response = cmRemote.login("kojokojo");
System.out.println("result="+response);

*lookup ไปที่ชื่อที่ Binding ไว้นะครับ ถ้าไม่ตั้ง จะเป็นชื่อเต็ม ของ class

เรียบร้อยครับ หวังว่าจะทำกันได้ไม่ติดปัญหานะ
ปล. อันนี้ลองที่เครื่องตัวเองครับ ถ้าข้ามเครื่องมีโอกาสที่จะติดปัญหาเรื่อง security อีก เหอๆ

สำหรับ Websphere กำลังลองทำอยู่น่าจะประมาณนี้นะ

public static Object remoteLookup(String className,String host,String port) {
		Context context = null;
		Object cl = null;
		try {
			Properties props = new Properties();

			Hashtable env = new Hashtable();
			env.put(Context.SECURITY_AUTHENTICATION, "simple");
			env.put(Context.SECURITY_CREDENTIALS, "xxxx");
			env.put(Context.SECURITY_PRINCIPAL, "xxxx");
			env.put(Context.INITIAL_CONTEXT_FACTORY,"com.ibm.websphere.naming.WsnInitialContextFactory");
                        //default Websphere ORB Listener Port(ORB_LISTENER_ADDRESS) is 9100
			env.put(Context.PROVIDER_URL,"iiop://host:port");
			context = new InitialContext(env);

			cl = context.lookup(className);
		} catch (NamingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return cl;
	}

About WK

Kajook is a Senior Software Engineer. Job is Design & Develop in Java EE environment on Glassfish. I'm Interested in Agile software development ,iOS and Android.
This entry was posted in knowledge and tagged , , . Bookmark the permalink.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s