Websphere(和Weblogic/Joss)中的远程EJB查找



我有一个用于搜索的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);
        }
    }
    ....
}

当我使用JNDI执行本地查找时,这种方法非常有效。由于某些原因需求,现在有必要在多个AP中部署EAR(包括在集群和非集群环境中)。此外,所使用的应用程序服务器在AP之间是相同的,但不一定是Websphere,即所有AP都可能使用JBoss/Websphere/Weblogic。

我的问题是,是否有一种独立于实现的方式来查找和调用远程EJB?适用于Websphere、Weblogic或JBoss环境(同构环境)的东西。

我的第二个问题是,假设AP服务器正在运行Websphere(在集群或非集群环境中),比如我希望所有AP服务器中的EmployeeAccessor都使用AP01中部署的LuceneEmployeeSearchManagerEJB(ip:x.x.x.x,port:yy),我该如何配置它?是否需要提供完整的JNDI名称(包括websphere的单元名称和节点名称)?INITIAL_CONTEXT_FACTORY的正确值是什么?正确的JNDI查找语法是什么?

感谢您的帮助:)

您应该使用默认的InitialContext()构造函数-然后它与平台无关,并使用ejb引用-然后它是与位置无关的-您可以在安装期间映射引用。因此,代码是独立的,但映射是特定于平台的,但是在应用程序之外完成的。如果您使用的是Java EE 6兼容服务器,您也可以使用注入@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/ILuceneEmployeeSearchManagerRemoteRefEJB引用,并将该引用映射到bean的JNDI名称。它可以在应用程序的安装/配置过程中完成,也可以在WebSphere的情况下通过ibm-web-bnd.xml文件完成。

以下是@EJB的示例(对于Java EE 5,它必须在servlet或JSF managedBean中,对于Java EE 6,您可以将它放在任何类中,但您需要为应用程序启用CDI):

public class MyServlet exetends HttpServlet {
    @EJB(name="ejb/ILuceneEmployeeSearchManagerRemote")
    private ILuceneEmployeeSearchManagerRemote searcher;  // replaces lookup
...}

同样,您需要将@EJB注释定义的ejb/ILuceneEmployeeSearchManagerRemote引用映射到实际的JNDI名称。

关于您的第二个问题(在WebSphere的情况下):

  • 如果bean位于SAME单元上,但位于其他服务器上,则它将形式:

    cell/nodes/<node-name>/servers/<server-name>/<name binding location> 
    

    例如:

    cell/nodes/S47NLA1/servers/Server47A1/ejb/Department549/AccountProcessors/CheckingAccountReconciler 
    
  • 如果bean在外部单元中,那么如果您想避免在Initial上下文中提供属性(主机、端口、工厂),最好的方法就是使用配置的绑定。请记住,对于默认配置中的跨单元,您必须交换SSL证书才能使其工作。

另请参阅:

  • EJB 3.0和EJB 3.1应用程序绑定概述
  • 配置的名称绑定

最新更新