【问题标题】:Remote EJB lookup in Websphere (and Weblogic/JBoss)Websphere(和 Weblogic/JBoss)中的远程 EJB 查找
【发布时间】:2014-10-15 07:57:42
【问题描述】:

我有一个用于搜索的 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:x.x.x.x,端口: yy),我该如何配置呢?是否需要提供完整的 JNDI 名称(包括 websphere 的单元名称和节点名称)? INITIAL_CONTEXT_FACTORY 的正确值是多少?什么是正确的 JNDI 查找语法?

感谢您的帮助:)

【问题讨论】:

    标签: jakarta-ee jboss ejb websphere weblogic


    【解决方案1】:

    您应该使用默认的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 注释定义)映射到实际的JNDI 名称。

    关于您的第二个问题(如果是 WebSphere):

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

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

      例如:

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

    另见:

    【讨论】:

    • 嗨@Gas如果要访问的远程EJB位于另一台机器上,您能否进一步扩展您的答案,或者您能否指出解决此问题的其他资源?根据我从您的回答中了解到的情况,我需要编辑我的 web.xml 和 ibm-web-bnd.xml 以供 EJB 参考。然后还可以使用 SSL 证书使其工作。
    • @Fritz Check this post - 您可以对外部 EJB 使用间接绑定。关于 SSL - 您需要将目标服务器证书导入源服务器信任库,并且如果 EJB 受到保护,则可能共享 LTPA 令牌密码。如果您有更详细的问题,请创建单独的问题。
    • 是的,谢谢。我已经让它为我工作了。感谢这些细节,因为它为我指明了正确的道路。 :D 干杯!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-16
    • 1970-01-01
    • 2019-08-16
    • 1970-01-01
    • 2013-10-04
    • 1970-01-01
    相关资源
    最近更新 更多