首页 文章

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

提问于
浏览
4

我有一个用于搜索的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中的LuceneEmployeeSearchManager EJB(ip:xxxx,port:yy),我该如何配置?是否有必要提供完整的JNDI名称(包括websphere的单元名称和节点名称)? INITIAL_CONTEXT_FACTORY的正确值是什么?什么是正确的JNDI查找语法?

感谢您的任何帮助 :)

1 回答

  • 2

    您应该使用默认 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/ILuceneEmployeeSearchManagerRemoteRef EJB引用,并将该引用映射到您的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/ILuceneEmployeeSearchManagerRemote 注释定义的 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证书才能使其正常工作 .

    也可以看看:

相关问题