Jakarta ee Websphere(和Weblogic/JBoss)中的远程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中

我有一个用于搜索的EJB类

@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证书才能使其正常工作

另见:


hi@Gas如果要访问的远程EJB位于另一台机器上,您能否对您的答案进行更多的扩展,或者您能否向我指出解决此问题的其他资源?根据我从您的答案中了解到的情况,我需要编辑web.xml和ibm-web-bnd.xml以供EJB参考。然后还要使用SSL证书使其工作。@Fritz Check-您可以对外部EJB使用间接绑定。关于SSL-您需要将目标服务器证书导入源服务器信任存储,如果EJB是安全的,可能还需要共享LTPA令牌密码。如果您有更详细的问题,请创建单独的问题。是的,谢谢。我已经让它为我工作了。感谢您提供的这些详细信息,因为它为我指明了正确的道路干杯!
cell/nodes/<node-name>/servers/<server-name>/<name binding location> 
cell/nodes/S47NLA1/servers/Server47A1/ejb/Department549/AccountProcessors/CheckingAccountReconciler