【问题标题】:Get EJB object inside rar deployed inside jboss获取部署在 jboss 中的 rar 中的 EJB 对象
【发布时间】:2017-06-06 14:18:19
【问题描述】:

我在我的 jboss 服务器中部署了一个 activemq 代理。 activemq 作为 rar 文件部署在 jboss 独立/部署存储库中。 另一个项目也部署在我的 jboss 中作为一个 ear 文件。
最后一个是在我的 jboss 中暴露一些 ejb 对象。 我试图从我放入我的activemq rar文件的jar文件中获取ejb。当我将客户端连接到代理时,将调用放置在 jar 中的类。

这就是我尝试在 jar 文件中获取 ejb 的方式:

  Context ctx; 
  Properties jndiProps = new Properties(); 
  jndiProps.put(Context.URL_PKG_PREFIXES, "org.jboss.ejb.client.naming"); 
  jndiProps.put("jboss.naming.client.ejb.context", true); 
  ctx = new InitialContext(jndiProps); 
  Ctx.lookup("ejb:Hemis/HemisCoreClient//"+ "HardwareDataManagement" + "!" + "com.ubiant.hemis.client.ejb.interf.I_HardwareDataManagement");

ejb 暴露时来自 jboss 的日志:

11:50:17,538 INFO [org.jboss.as.ejb3.deployment.processors.EjbJndiBindingsDeploymentUnitProcessor](MSC 服务线程 1-4)部署单元子部署中名为 HardwareDataManagement 的会话 bean 的 JNDI 绑定“HemisCoreClient.jar部署“Hemis.ear”如下:

java:global/Hemis/HemisCoreClient/HardwareDataManagement!com.ubiant.hemis.client.ejb.interf.I_HardwareDataManagement java:app/HemisCoreClient/HardwareDataManagement!com.ubiant.hemis.client.ejb.interf.I_HardwareDataManagement java:module/HardwareDataManagement!com.ubiant.hemis.client.ejb.interf.I_HardwareDataManagement java:jboss/exported/Hemis/HemisCoreClient/HardwareDataManagement!com.ubiant.hemis.client.ejb.interf.I_HardwareDataManagement java:global/Hemis/HemisCoreClient/HardwareDataManagement java:app/HemisCoreClient/HardwareDataManagement java:模块/硬件数据管理*

我尝试将客户端连接到代理时的日志错误:

17:26:15,555 错误 [stderr] (qtp1869699331-251) javax.naming.NameNotFoundException;剩余名称'java:Hemis/HemisCoreClient//HardwareDataManagement!com.ubiant.hemis.client.ejb.interf.I_HardwareDataManagement' 17:26:15,556 错误 [stderr] (qtp1869699331-251) 在 org.eclipse.jetty.jndi.local.localContextRoot.lookup(localContextRoot.java:490) 17:26:15,557 错误 [stderr] (qtp1869699331-251) 在 org.eclipse.jetty.jndi.local.localContextRoot.lookup(localContextRoot.java:536) 17:26:15,557 错误 [stderr] (qtp1869699331-251) 在 javax.naming.InitialContext.lookup(InitialContext.java:411) 17:26:15,558 错误 [stderr] (qtp1869699331-251) 在 authentification.TokenAuthentificationBroker.addConnection(TokenAuthentificationBroker.java:46) 17:26:15,558 错误 [stderr] (qtp1869699331-251) 在 org.apache.activemq.broker.MutableBrokerFilter.addConnection(MutableBrokerFilter.java:97) 17:26:15,558 错误 [stderr] (qtp1869699331-251) 在 org.apache.activemq.broker.TransportConnection.processAddConnection(TransportConnection.java:733) 17:26:15,559 错误 [stderr] (qtp1869699331-251) 在 org.apache.activemq.broker.jmx.ManagedTransportConnection.processAddConnection(ManagedTransportConnection.java:79) 17:26:15,559 错误 [stderr] (qtp1869699331-251) 在 org.apache.activemq.command.ConnectionInfo.visit(ConnectionInfo.java:139) 17:26:15,560 错误 [stderr] (qtp1869699331-251) 在 org.apache.activemq.broker.TransportConnection.service(TransportConnection.java:292) 17:26:15,561 错误 [stderr] (qtp1869699331-251) 在 org.apache.activemq.broker.TransportConnection$1.onCommand(TransportConnection.java:149) 17:26:15,562 错误 [stderr] (qtp1869699331-251) 在 org.apache.activemq.transport.TransportSupport.doConsume(TransportSupport.java:83) 17:26:15,562 错误 [stderr] (qtp1869699331-251) 在 org.apache.activemq.transport.ws.MQTTSocket.sendToActiveMQ(MQTTSocket.java:112) 17:26:15,563 错误 [stderr] (qtp1869699331-251) 在 org.apache.activemq.transport.mqtt.MQTTProtocolConverter.sendToActiveMQ(MQTTProtocolConverter.java:133) 17:26:15,564 错误 [stderr] (qtp1869699331-251) 在 org.apache.activemq.transport.mqtt.MQTTProtocolConverter.onMQTTConnect(MQTTProtocolConverter.java:235) 17:26:15,564 错误 [stderr] (qtp1869699331-251) 在 org.apache.activemq.transport.mqtt.MQTTProtocolConverter.onMQTTCommand(MQTTProtocolConverter.java:157) 17:26:15,566 错误 [stderr] (qtp1869699331-251) 在 org.apache.activemq.transport.ws.MQTTSocket.onMessage(MQTTSocket.java:59) 17:26:15,566 错误 [stderr] (qtp1869699331-251) 在 org.eclipse.jetty.websocket.WebSocketConnectionRFC6455$WSFrameHandler.onFrame(WebSocketConnectionRFC6455.java:860) org.eclipse.jetty.websocket.WebSocketParserRFC6455.parseNext(WebSocketParserRFC6455.java:349) 处的 17:26:15,567 错误 [stderr] (qtp1869699331-251) org.eclipse.jetty.websocket.WebSocketConnectionRFC6455.handle(WebSocketConnectionRFC6455.java:225) 处的 17:26:15,568 错误 [stderr] (qtp1869699331-251) 17:26:15,568 错误 [stderr] (qtp1869699331-251) 在 org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:628) 17:26:15,569 错误 [stderr] (qtp1869699331-251) 在 org.eclipse.jetty.io.nio.SelectChannelEndPoint$1.run(SelectChannelEndPoint.java:52) 17:26:15,571 错误 [stderr] (qtp1869699331-251) 在 org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:608) 17:26:15,571 错误 [stderr] (qtp1869699331-251) 在 org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:543) 17:26:15,572 错误 [stderr] (qtp1869699331-251) 在 java.lang.Thread.run(Thread.java:745)

当我从一个暴露 EJB 的耳朵内的类中尝试这段代码时,它可以工作并且我可以获得 EJB 对象。我是否认为问题在于我尝试从部署在我的 jboss 中的 rar 中包含的 jar 中获取 ejb。 有人可以帮我解决这个问题吗?

【问题讨论】:

    标签: java jboss ejb jndi naming


    【解决方案1】:

    应该没有必要执行这样的远程查找。

    以下应该起作用:

     Context ctx = new InitialContext();
     ... = ctx.lookup("java:global/Hemis/HemisCoreClient/HardwareDataManagement!com.ubiant.hemis.client.ejb.interf.I_HardwareDataManagement");
    

    java:global/... 命名空间中的对象可以从部署在服务器实例上的任何模块中访问。

    【讨论】:

    • 我应该在我的 ra.xml 文件中添加一些东西吗?
    • 您的 rar 文件中似乎也有一个 jetty-jndi.jar(请参阅堆栈跟踪中的 org.eclipse.jetty.jndi.local.localContextRoot.lookup) - 那是在做什么?
    • 我的 activemq rar 中有两个 jetty jar 文件:jetty-websocket.jar 和 jetty-all-server.jar。 Jetty 被 activemq 使用。我认为它是activemq的内部服务器。我在 activemq 论坛上发布了一个问题,以查看问题是否来自码头,但我收到回复说它与 jndi 问题有关。但我仍然怀疑这个问题与码头有关。
    • 我刚刚下载了activemq-rar-5.14.5,它不包含这些jar。该类正在破坏您的 JNDI 查找。
    • 是的,它没有,但我需要码头使用 websocket over mqtt 和 activemq。我自己从包含所有可选 jar 的 activemq.rar 添加了 jar。
    【解决方案2】:

    正如我在http://activemq.2283324.n4.nabble.com/Adding-activemq-jetty-all-jar-for-using-ws-doesn-t-allow-me-anymore-getting-jboss-exposed-ejb-tp4727190p4727305.html 上发布的,我相信您的问题可以归结为以下几点:

    当部署到 JBoss 的 webapp 包含 jetty-all.jar 时,Jetty 类会导致将默认 InitialContext 创建为 Jetty 类。我怎样才能获得 JBoss InitialContext 来允许查找 JBoss 公开的 EJB?

    似乎 Jetty JAR 正在将 InitialContextFactory 类属性设置为特定于 Jetty 的东西,覆盖由 JBoss JAR 设置的特定于 JBoss 的值。要强制它回到 JBoss 类,您可以在创建 InitialContext 时尝试设置以下选项吗?

    props.put(Context.INITIAL_CONTEXT_FACTORY, org.jboss.naming.remote.client.InitialContextFactory");

    如果问题真的只是你得到了错误的 JNDI 上下文,那一行应该可以解决问题。

    【讨论】:

    • 现在当我尝试获取 EJB 时,我得到了这个:Stopping MQTTSocket_890308146 because Failed with SecurityException: EJB client context selector may not be changed。我认为这与我从码头服务器中运行的代码连接到 jboss 服务器这一事实有关。你能帮我解决这个问题吗?
    • 作为参考,OP 关于他评论中提到的错误的新帖子位于stackoverflow.com/questions/44653347/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多