2017-04-03 22 views
0

OpenJDK 8을 사용하여 JBoss EAP 6.4에서 실행되는 Liferay 포털 6.2에 JSF 포틀릿을 배포하려고합니다. 포틀릿이 WAR 파일을 생성하지만 원격 인터페이스를 통해 EJB의 일부 메소드를 호출합니다. EJB는 JBoss에 직접 EAR 파일로 배포됩니다.포틀릿의 JSF 관리 빈에서 원격 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 

두 메시지에 노드 이름이 없음을 유의하십시오 ("노드"앞에 두 공백). 그것이 작동하는 내 개발 기계에서

는 첫 번째 메시지는 노드 이름을 포함하지, 두 번째 메시지가 표시되지 않습니다

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= 

유일한 diference 내 컴퓨터에 내가 직접려고하고 있다는 것입니다 테스트 머신에서로드 밸런서 ([Browser] - HTTP -> [Apache] - AJP -> [HTTPS])를 거치면서 서버 ([Browser] - HTTP -> [JBoss] JBoss]). 이는 메시지에 반영됩니다 (ajp-/0.0.0.0 vs - 0.0.0.0).

원격 인터페이스를 통해 EJB에서 메소드를 호출하려고하면 예외가 발생합니다. 로컬 스텁에 대한 참조는 조회를 통해 얻어지며 결과는 null이 아닙니다. 배포시 오류가 없으며 조회에서 오류가 발생하지 않습니다.

무슨 일이 생길 수 있으며 무엇이 누락 될 수 있습니까?

+0

원격 EJB가 동일한 JBoss EAP 인스턴스에 배포되었거나 다른 JBoss EAP 인스턴스에 배포 되었습니까? –

+0

같은 용기에 있습니다. –

+0

이 경우 EJB 클라이언트 메커니즘을 전혀 사용하지 않아야합니다. 그냥 바닐라 JNDI 조회 (속성없이)를 사용하십시오. –

답변

1

내 친구가 해결책을 찾았습니다.

테스트 머신이 실제로 도커 컨테이너였습니다. 그리고 JBoss에 docker가 호스트 이름을 읽지 않고 노드 이름을 선택하지 못하게하는 버그가있는 것 같습니다. 그래서 시작될 때의 노드 이름은 비어 있습니다. 따라서 빈 이름 노드 위의 메시지가 표시되고 오류가 표시됩니다.

해결 방법은 JBoss에 -Djboss.node.name 매개 변수가있는 노드 이름을 지정하는 것입니다. 나는 그 설정을 standalone.conf에두고 JBoss를 재시작했다. 이제 첫 번째 메시지에는 지정한 이름이 표시되고 두 번째 메시지는 표시되지 않으며 예외도 표시되지 않습니다.