我有两个TomEE实例(当前是不同的容器),并且我想让它们之间运行Remote EJB。但是,我在执行此操作时遇到了问题。
首先,我在TomEE实例上启用了远程EJB支持。我将以下内容添加到system.properties文件中。基于此线程Remote EJB lookup using OpenEJB in Tomee
tomee.remote.support = true
tomee.serialization.class.blacklist = -
tomee.serialization.class.whitelist = *
openejb.system.apps = true
openejb.servicemanager.enabled = true
我的服务器TomEE Ear已成功部署,并且可以看到我的远程Ejb的JNDI名称。
INFO: Extracting jar: /usr/local/tomee/apps/simpleEJB-ear-1.0.ear
INFO: Extracted path: /usr/local/tomee/apps/simpleEJB-ear-1.0
INFO: Found EjbModule in classpath: /usr/local/tomee/apps/simpleEJB-ear-1.0/simpleEJB-ejbs-1.0.jar
INFO: Configuring enterprise application: /usr/local/tomee/apps/simpleEJB-ear-1.0
INFO: Enterprise application "/usr/local/tomee/apps/simpleEJB-ear-1.0" loaded.
INFO: Creating dedicated application classloader for simpleEJB-ear-1.0
INFO: Assembling app: /usr/local/tomee/apps/simpleEJB-ear-1.0
INFO: Jndi(name=global/simpleEJB-ear-1.0/simpleEJB-ejbs-1.0/HelloImpl!com.wk.Hello) --> Ejb(deployment-id=HelloImpl)
INFO: Jndi(name=global/simpleEJB-ear-1.0/simpleEJB-ejbs-1.0/HelloImpl) --> Ejb(deployment-id=HelloImpl)
INFO: Deployed Application(path=/usr/local/tomee/apps/simpleEJB-ear-1.0)
现在,当我从另一个TomEE实例中进行查找时,会收到RemoteEJBExceptions。下面是部署在TomEE上的我的客户端代码,该代码查找远程EJB:
@PostConstruct
public void init() {
Properties props = new Properties();
Properties p = new Properties();
p.put(Context.INITIAL_CONTEXT_FACTORY, "org.apache.openejb.client.RemoteInitialContextFactory");
p.put(Context.PROVIDER_URL, "http://172.17.0.2:8080/tomee/ejb");
InitialContext ic = new InitialContext(props);
//hello = (com.wk.Hello) ic.lookup("com.wk.Hello");
hello = (com.wk.Hello) ic.lookup("com.wk.Hello");
}
但是,查找失败,但出现以下异常:
Caused by: javax.ejb.EJBException: javax.naming.NameNotFoundException: Name [com.wk.Hello] is not bound in this Context. Unable to find [com.wk.Hello].
要使它正常工作,我缺少什么?我的目标是将我们的某些JavaEE应用程序从glassfish移到TomEE,因此我正在研究POC,以了解某些JavaEE功能在TomEE下如何工作。
任何帮助将不胜感激。谢谢!
答案 0 :(得分:0)
我实际上发现了我做错了什么,现在我在不同的TomEE实例上相互进行了远程EJB交谈。两件事,一是我的JDNI名称错误。 com.wk.Hello样式的JDNI名称查找似乎是Glassfish特定的方式,而不是真正的JavaEE标准方式。因此,我将JDNI名称更改为HelloImplRemote。如果您对JNDI的catalina日志进行grep复制,则会看到查找JNDI资源的各种方式。
另一个问题是我有两个不同的Properties实例。
@PostMapping("/rentBook")
public String rentBook(@ModelAttribute("book") Book theBook) {
bookService.saveBook(theBook);
return "redirect:/book/list-books";
}
一个是props,它是空的,另一个是p,它设置了上下文工厂和提供者URL,但是,在初始化InitialContext对象时,我错误地使用了空道具,而不是正确地设置所有内容的正确属性实例。
无论如何,在修复了这两件事之后,一切似乎都正常了!