我想将JSF Portlet部署到运行在JBoss EAP 6.4和OpenJDK 8上的Liferay门户6.2中。该Portlet部署为WAR文件,但通过远程接口调用EJB的某些方法。 EJB作为一个EAR文件直接部署在JBoss上。从Portlet中的JSF受管Bean调用远程EJB方法时出错
在我的开发机器上工作正常。但在测试机器中,它不是。 WAR和EAR文件完全相同,两台机器的standalone.xml设置几乎相同,而且JBoss模块也相同。
在日志中打印的堆栈跟踪如下:
JBWEB000236: Servlet.service() for servlet Adminis Servlet threw exception: javax.portlet.faces.BridgeException: javax.faces.FacesException
at com.liferay.faces.bridge.BridgePhaseRenderImpl.execute(BridgePhaseRenderImpl.java:91) [liferay-faces-bridge-impl-3.2.4-ga5.jar:3.2.4-ga5 (Ephesus/Feb 15, 2014 AD)]
at com.liferay.faces.bridge.BridgeImpl.doFacesRequest(BridgeImpl.java:112) [liferay-faces-bridge-impl-3.2.4-ga5.jar:3.2.4-ga5 (Ephesus/Feb 15, 2014 AD)]
...
at java.lang.Thread.run(Thread.java:745) [rt.jar:1.8.0_121]
Caused by: javax.faces.FacesException
at com.sun.faces.context.ExceptionHandlerImpl.handle(ExceptionHandlerImpl.java:139) [jsf-impl-2.1.28.redhat-8.jar:2.1.28.redhat-8]
at org.icefaces.impl.application.ExtendedExceptionHandler.handle(ExtendedExceptionHandler.java:113) [icefaces-3.3.0.jar:]
... 194 more
Caused by: java.util.NoSuchElementException
at java.util.HashMap$HashIterator.nextNode(HashMap.java:1439) [rt.jar:1.8.0_121]
at java.util.HashMap$KeyIterator.next(HashMap.java:1461) [rt.jar:1.8.0_121]
at org.jboss.ejb.client.EJBClientContext.getEJBReceiver(EJBClientContext.java:725) [jboss-ejb-client-1.0.30.Final-redhat-1.jar:1.0.30.Final-redhat-1]
at org.jboss.ejb.client.EJBInvocationHandler.invoke(EJBInvocationHandler.java:146) [jboss-ejb-client-1.0.30.Final-redhat-1.jar:1.0.30.Final-redhat-1]
...
at com.sun.proxy.$Proxy459.obtenerUsuarioPorCodigo(Unknown Source)
at com.sofis.adminis.delegates.PermisosDelegate.obtenerUsuarioPorCodigo(PermisosDelegate.java:450) [adminis-delegate-1.0.jar:]
at com.sofis.security.web.UsuariosSessionBeanWeb.autenticar(UsuariosSessionBeanWeb.java:1927) [classes:]
at com.sofis.security.web.listeners.SofisAutologinLiferayPhaseListener.afterPhase(SofisAutologinLiferayPhaseListener.java:54) [classes:]
at com.sun.faces.lifecycle.Phase.handleAfterPhase(Phase.java:189) [jsf-impl-2.1.28.redhat-8.jar:2.1.28.redhat-8]
at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:107) [jsf-impl-2.1.28.redhat-8.jar:2.1.28.redhat-8]
... 198 more
我惜售日志级别设置为“org.jboss.ejb.client”现在我只是stactrace之前看到两个有趣的消息:
22:13:16,684 DEBUG [org.jboss.ejb.client.EJBClientContext] (ajp-/0.0.0.0:8009-5) org.jboss.[email protected]4bc9113e deployment node selector selected node for appname=SS-ADMINIS-ear-1.0,modulename=SS-ADMINIS-MAVEN-EJB-1.0,distinctname=
22:13:16,687 DEBUG [org.jboss.ejb.client.EJBClientContext] (ajp-/0.0.0.0:8009-5) Selected node doesn't belong to eligible receivers. Continuing with a random eligible receiver
请注意,两个消息中都没有节点名称(“node”之前有两个空格)。
在我开发的机器,它的工作原理,第一条消息的确包括一个节点名,并没有出现第二个消息:
18:56:37,902 DEBUG [org.jboss.ejb.client.EJBClientContext] (http-/0.0.0.0:8080-2) org.jboss.[email protected]6db73304 deployment node selector selected spio node for appname=SS-ADMINIS-ear-1.0,modulename=SS-ADMINIS-MAVEN-EJB-1.0,distinctname=
唯一性差异的是,在我的机器,我直接去浏览器到服务器([浏览器] - HTTP - > [JBoss]),而在测试机器中,我通过负载平衡器([浏览器] - HTTP - > [Apache] - AJP - > [ JBoss的])。这反映在消息中(ajp- /.0.0.0 vs http-/0.0.0.0)。
当我尝试通过远程接口从EJB调用方法时,会引发异常。通过查找获得对本地存根的引用,并且结果不为空。部署时没有错误,查找也不会引发错误。
可能发生什么或我错过了什么?
远程EJB是否部署在同一个JBoss EAP实例或不同的实例中? –
在同一个容器中。 –
在这种情况下,您根本不应该使用EJB客户端机制;只需使用vanilla JNDI查找(无属性) –