2017-04-03 31 views
0

我想將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調用方法時,會引發異常。通過查找獲得對本地存根的引用,並且結果不爲空。部署時沒有錯誤,查找也不會引發錯誤。

可能發生什麼或我錯過了什麼?

+0

遠程EJB是否部署在同一個JBoss EAP實例或不同的實例中? –

+0

在同一個容器中。 –

+0

在這種情況下,您根本不應該使用EJB客戶端機制;只需使用vanilla JNDI查找(無屬性) –

回答

1

我的一位朋友找到了解決方案。

某事沒有說的是測試機器實際上是碼頭集裝箱。看起來在JBoss中存在一個bug,docker使前者不讀取主機名來選擇節點名稱,所以de節點名稱在啓動時爲空。因此,顯示正在選擇的空名稱節點上方的消息,然後顯示錯誤。

解決方法是使用參數-Djboss.node.name指定一個節點名稱給JBoss。我把這個設置放在standalone.conf中,重啓了JBoss,它運行的很好。現在,第一條消息顯示了我指定的名稱,第二條消息沒有出現,也沒有出現異常。