怎么跨App 远程调用EJB

AppB想调用另外一个web应用AppA提供的EJB,有看到网上一些文章如是说:

Hashtable environment = new Hashtable();
environment.put(Context.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory");
environment.put(Context.URL_PKG_PREFIXES, "org.jboss.naming:org.jnp.interfaces");
environment.put("java.naming.provider.url", "jnp://www.aaa.com:1099");
InitialContext ctx = null;
try {
ctx = new InitialContext(environment);

System.out.println("ctx.lookup(WorkListManager):==========" + "WorkListManager");
Object obj = ctx.lookup("java:comp/env/ejb/bnsbase/Role");
Role = ((RoleHome) PortableRemoteObject.narrow(obj, WorkListManagerHome.class)).create();

} catch (NamingException ex) {
System.err.println(" ex1: " + ex);
}

我很奇怪,在本地AppB根本就没有RoleHome以及Role的class,因为他们都是RoleEJB的class,那么我怎么cast成为AppA中才有的EJB对象呢?难道AppB端也需要添加这个EJB?

真的不是很了解!请各位高人指点一二!

这个EJB的.jar包作为你AppB的支持包,然后也必须打包到你的AppB中。

谢谢指点!

另外一些疑惑:这就是所谓的 Distributed Counting 么?


在设置Context参数时我有些东西不太了解
environment.put(Context.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory");
// environment.put(Context.URL_PKG_PREFIXES, "java.naming.factory.url.pkgs");
environment.put("java.naming.provider.url", "jnp://211.211.211.211:1099");


这样的写法好像也是不对的,AppA使用websphere作为服务器,AppB使用Weblogic作为服务器,所以我想应该此处建立webSphere的context,那么Context.INITIAL_CONTEXT_FACTORY 的值要设置成什么呢? java.naming.provider.url 呢?

有文章好像说 上面的Context.INITIAL_CONTEXT_FACTORY 是dedicate JBoss,那么下面的 jnp:// 呢?(211.211.211.211 是AppA的外部ip,那么1099是default的还是需要与AppA的端口一样呢?)

原理是这样:
被调用的EJB被部署时,其JNDI名称会登记在该服务器的JNDI服务中,外界调用该EJB之前,必须先定位到该服务器的JNDI服务。