Jakarta ee Websphere(和Weblogic/JBoss)中的远程EJB查找
我有一个用于搜索的EJB类Jakarta ee Websphere(和Weblogic/JBoss)中的远程EJB查找,jakarta-ee,jboss,ejb,websphere,weblogic,Jakarta Ee,Jboss,Ejb,Websphere,Weblogic,我有一个用于搜索的EJB类 @Local(ILuceneEmployeeSearchManagerLocal.class) @Remote(ILuceneEmployeeSearchManagerRemote.class) public class LuceneEmployeeSearchManager implements ILuceneEmployeeSearchManagerLocal, ILuceneEmployeeSearchManagerRemote{ .... } 同一个EAR中
@Local(ILuceneEmployeeSearchManagerLocal.class)
@Remote(ILuceneEmployeeSearchManagerRemote.class)
public class LuceneEmployeeSearchManager implements ILuceneEmployeeSearchManagerLocal, ILuceneEmployeeSearchManagerRemote{
....
}
同一个EAR中的WAR项目中有另一个类访问此
public class EmployeeAccessor {
private ILuceneEmployeeSearchManagerRemote searcher;
public EmployeeMstAccessor() {
Context ic = null;
try {
Properties props = new Properties();
props.put(Context.INITIAL_CONTEXT_FACTORY, "<WHAT_TO_PUT_HERE>");
props.put(Context.PROVIDER_URL, "iiop://127.0.0.1:9083");
ic = new InitialContext(props);
this.searcher = (ILuceneEmployeeSearchManagerRemote) ic
.lookup("<WHAT_TO_PUT_HERE?>");
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
....
}
公共类EmployeeAccessor{
私人IluceNeEmployeeSearchManager远程搜索器;
公共雇员mstaccessor(){
上下文ic=null;
试一试{
Properties props=新属性();
props.put(Context.INITIAL_Context_FACTORY,“”);
props.put(Context.PROVIDER\u URL,“iiop://127.0.0.1:9083");
ic=新的初始上下文(道具);
this.searcher=(ILuceneEmployeeSearchManagerRemote)ic
.查阅(“”);
}捕获(例外e){
e、 printStackTrace();
抛出新的运行时异常(e);
}
}
....
}
当我使用JNDI执行本地查找时,它工作得非常好。由于某种原因
根据需求,现在有必要在多个AP中部署EAR(在集群和非集群环境中)。此外,在APs中使用的应用服务器将是相同的,但不一定是Websphere,即所有APs都可能使用JBoss/Websphere/Weblogic
我的问题是,是否有一种独立于实现的方式来查找和调用远程EJB?适用于Websphere、Weblogic或JBoss环境(同构环境)的东西
我的第二个问题是假设AP服务器正在运行Websphere(在集群或非集群环境中),假设我希望所有AP服务器中的EmployeeAccessor都使用部署在AP01中的LuceneEmployeeSearchManager EJB(ip:x.x.x.x,port:yy),我如何配置它?是否有必要给出完整的JNDI名称(包括websphere的单元名和节点名)?初始上下文工厂的正确值是什么?正确的JNDI查找语法是什么
感谢您的帮助:)您应该使用默认的
InitialContext()
构造函数-然后它是平台独立的,使用ejb引用-然后它是位置独立的-您可以在安装期间映射引用。所以代码是独立的,但映射是特定于平台的,但在应用程序之外完成。如果您使用的是兼容JavaEE6的服务器,那么还可以使用注入@EJB。
因此,您的代码可以如下所示:
public EmployeeMstAccessor() {
Context ic = null;
try {
ic = new InitialContext();
this.searcher = (ILuceneEmployeeSearchManagerRemote) ic
.lookup("java:comp/env/ejb/ILuceneEmployeeSearchManagerRemoteRef");
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
然后需要在web模块的web.xml
中创建ejb/ILuceneEmployeeSearchManagerRemoteRef
ejb引用,并将该引用映射到bean的JNDI名称。它可以在应用程序的安装/配置过程中完成,或者在WebSphere中通过IBMWebBND.xml
文件完成
下面是一个带有@EJB
的示例(对于Java EE 5,这必须在servlet或JSF managedBean中,对于Java EE 6,您可以将其放在任何类中,但需要为应用程序启用CDI):
同样,您需要将@ejb
注释定义的ejb/ILuceneEmployeeSearchManagerRemote
引用映射到实际的JNDI名称
关于第二个问题(对于WebSphere):
- 如果bean位于同一个单元上,但位于另一台服务器上,它将
形式如下:
cell/nodes/<node-name>/servers/<server-name>/<name binding location>
- 如果bean位于外部单元中,那么如果您希望避免在初始上下文中提供属性(主机、端口、工厂),最好的方法是使用配置的绑定。请记住,对于默认配置中的跨单元,您必须交换SSL证书才能使其正常工作
cell/nodes/<node-name>/servers/<server-name>/<name binding location>
cell/nodes/S47NLA1/servers/Server47A1/ejb/Department549/AccountProcessors/CheckingAccountReconciler