Calling EJB3 deployed in Websphere AS7 from Standalone Java client
詳細
1、先にEJB 3を作成する:
ビジネスインタフェースFirstEJBService
EJB LocalインタフェースFirstEJBServiceBeanLocal
EJB RemoteインタフェースFirstEJBServiceBeanRemote
ビジネス実装クラスFirstEJBServiceBean
2、jarにパッケージ化した後、Websphereに発表する.
3、JNDIを見る
cmdでWebSphereAppServerbinディレクトリのdumpNameSpace.batを呼び出すと、すべてのJNDIが表示され、そのEJBに対応するJNDIのフルネームが見つかります.
4、Standalone Java clientの作成
Clientでは、com.ibm.websphere.naming.WsnInitialContextFactoryクラスが必要です.WebSphereAppServerruntimesディレクトリの下にあるcom.ibm.ws.admin.client_7.0.0.jarでは、実行時にclasspathにjarを追加する必要があります.
これで終わりではありません.ClientとEJBは同じJVMにないため、WebSphereAppServerbinディレクトリのcreateEJBStubs.batを呼び出してEJB stubを作成する必要があります.
実行時にcreateEJBStubs.batが生成されます.FirstEJBService_Stub.classはclasspathに入れます.そうしないと、異常が発生します.
または
1、先にEJB 3を作成する:
ビジネスインタフェースFirstEJBService
package com.first;
public interface FirstEJBService {
void print(String msg);
}
EJB LocalインタフェースFirstEJBServiceBeanLocal
package com.first;
import javax.ejb.Local;
@Local
public interface FirstEJBServiceBeanLocal extends FirstEJBService {
}
EJB RemoteインタフェースFirstEJBServiceBeanRemote
package com.first;
import javax.ejb.Remote;
@Remote
public interface FirstEJBServiceBeanRemote extends FirstEJBService {
}
ビジネス実装クラスFirstEJBServiceBean
package com.first;
import javax.ejb.Local;
import javax.ejb.Remote;
import javax.ejb.Stateless;
@Stateless(mappedName = "FirstEJBServiceBean")
@Local({ FirstEJBServiceBeanLocal.class })
@Remote({ FirstEJBServiceBeanRemote.class })
public class FirstEJBServiceBean implements FirstEJBService {
@Override
public void print(String msg) {
System.out.println("FirstEJBService echo : " + msg);
}
}
2、jarにパッケージ化した後、Websphereに発表する.
3、JNDIを見る
cmdでWebSphereAppServerbinディレクトリのdumpNameSpace.batを呼び出すと、すべてのJNDIが表示され、そのEJBに対応するJNDIのフルネームが見つかります.
4、Standalone Java clientの作成
package com.ejbclient.first;
import java.util.Properties;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import com.first.FirstEJBService;
public class FirstEJBClient {
/**
* @param args
* @throws NamingException
*/
public static void main(String[] args) throws NamingException {
Properties env = new Properties();
env.put(Context.INITIAL_CONTEXT_FACTORY,
"com.ibm.websphere.naming.WsnInitialContextFactory");
env.put(Context.PROVIDER_URL, "iiop://localhost:2809");
InitialContext context = new InitialContext(env);
Object result = context
.lookup("ejb/FirstEJB/FirstEJB.jar/FirstEJBServiceBean#com.first.FirstEJBServiceBeanRemote");
FirstEJBService service = (FirstEJBService) javax.rmi.PortableRemoteObject
.narrow(result, FirstEJBService.class);
service.print("Hello EJB");
}
}
Clientでは、com.ibm.websphere.naming.WsnInitialContextFactoryクラスが必要です.WebSphereAppServerruntimesディレクトリの下にあるcom.ibm.ws.admin.client_7.0.0.jarでは、実行時にclasspathにjarを追加する必要があります.
これで終わりではありません.ClientとEJBは同じJVMにないため、WebSphereAppServerbinディレクトリのcreateEJBStubs.batを呼び出してEJB stubを作成する必要があります.
createEJBStubs.bat com.first.FirstEJBService -cp .
実行時にcreateEJBStubs.batが生成されます.FirstEJBService_Stub.classはclasspathに入れます.そうしないと、異常が発生します.
java.lang.ClassCastException: org.omg.stub.java.rmi._Remote_Stub incompatible with com.first.FirstEJBService
または
Exception in thread "P=556551:O=0:CT" java.lang.ClassCastException: Unable to load class: com.first._FirstEJBService_Stub