gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 19:09:30 24 4
gpt4 key购买 nike

我有一个用于搜索的 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 查找语法?

感谢您的任何帮助 :)

最佳答案

您应该使用默认 InitialContext()构造函数 - 然后它是平台独立的,并使用 ejb 引用 - 然后它是位置独立的 - 您在安装期间映射您的引用。因此代码是独立的,但映射是特定于平台的,但在应用程序之外完成。如果您使用的是符合 Java EE 6 的服务器,您还可以使用注入(inject) @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);
}
}

那么你需要创建 ejb/ILuceneEmployeeSearchManagerRemoteRef web.xml 中的 EJB 引用您的 Web 模块的名称,并将该引用映射到您的 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 在外部单元中,那么最好的方法是使用配置的绑定(bind),如果您想避免在初始上下文中提供属性(主机、端口、工厂)。请记住,对于默认配置中的跨单元,您必须交换 SSL 证书才能使其工作。

  • 也可以看看:
  • EJB 3.0 and EJB 3.1 application bindings overview
  • Configured name bindings
  • 关于jakarta-ee - Websphere(和 Weblogic/JBoss)中的远程 EJB 查找,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26377339/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com