2017-10-06 55 views
1

간단한 tcp 인바운드 리소스 어댑터 (RA)가 github에서 example project으로 프로 그램되어 standalone-full로 wildfly 10.x에 성공적으로 배포되었습니다 구성. 메시지 수신기 TcpMessageListener 인터페이스는 RA에 있고 ra.xml 설명자에 정의되어 있지만 메시지 구동 Bean (MDB)을 연결할 수 없습니다. RA의 eis 측은 예상대로 작동하며 텔넷을 사용하여 메시지를 연결/전송할 수 있습니다. 나는 제이보스 받는다는 플러그인으로 MDB를 배포하려고하면 MDB는 TcpMessageListener를 찾을 수 없습니다 나는 java.lang.NoClassDefFoundError을 가지고 :Wildfly 10.x에서 인바운드 리소스 어댑터에 MDB를 연결하지 못했습니다. - 배포가 실패했습니다.

WARN [org.jboss.modules] (MSC service thread 1-7) Failed to define class de.bitc.ejb.InboundEventHandler in Module "deployment.ra-ear.ear.ra-user-ejb-0.0.1-SNAPSHOT.jar:main" from Service Module Loader: java.lang.NoClassDefFoundError: Failed to link de/bitc/ejb/InboundEventHandler (Module "deployment.ra-ear.ear.ra-user-ejb-0.0.1-SNAPSHOT.jar:main" from Service Module Loader): de/bitc/jca/inflow/TcpMessageListener 
     at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
    . 
    . 
    . 
ERROR [org.jboss.msc.service.fail] (MSC service thread 1-7) MSC000001: Failed to start service jboss.deployment.subunit."ra-ear.ear"."ra-user-ejb-0.0.1-SNAPSHOT.jar".POST_MODULE: org.jboss.msc.service.StartException in service jboss.deployment.subunit."ra-ear.ear"."ra-user-ejb-0.0.1-SNAPSHOT.jar".POST_MODULE: WFLYSRV0153: Failed to process phase POST_MODULE of subdeployment "ra-user-ejb-0.0.1-SNAPSHOT.jar" of deployment "ra-ear.ear" 
    . 
    . 
    . 
Caused by: java.lang.NoClassDefFoundError: Failed to link de/bitc/ejb/InboundEventHandler (Module "deployment.ra-ear.ear.ra-user-ejb-0.0.1-SNAPSHOT.jar:main" from Service Module Loader): de/bitc/jca/inflow/TcpMessageListener 
    . 
    . 
    . 
ERROR [org.jboss.as.controller.management-operation] (management-handler-thread - 17) WFLYCTL0013: Operation ("add") failed - address: ([("deployment" => "ra-ear.ear")]) - failure description: { 
"WFLYCTL0080: Failed services" => {"jboss.deployment.subunit.\"ra-ear.ear\".\"ra-user-ejb-0.0.1-SNAPSHOT.jar\".POST_MODULE" => "org.jboss.msc.service.StartException in service jboss.deployment.subunit.\"ra-ear.ear\".\"ra-user-ejb-0.0.1-SNAPSHOT.jar\".POST_MODULE: WFLYSRV0153: Failed to process phase POST_MODULE of subdeployment \"ra-user-ejb-0.0.1-SNAPSHOT.jar\" of deployment \"ra-ear.ear\" 
Caused by: java.lang.NoClassDefFoundError: Failed to link de/bitc/ejb/InboundEventHandler (Module \"deployment.ra-ear.ear.ra-user-ejb-0.0.1-SNAPSHOT.jar:main\" from Service Module Loader): de/bitc/jca/inflow/TcpMessageListener"}, 
"WFLYCTL0412: Required services that are not installed:" => ["jboss.deployment.subunit.\"ra-ear.ear\".\"ra-user-ejb-0.0.1-SNAPSHOT.jar\".POST_MODULE"], 
"WFLYCTL0180: Services with missing/unavailable dependencies" => undefined 

EJB를 받는다는 서브 모듈의 의존성은 provided 범위에있다. 나는 RA의 배포와 함께 redhat guide을 따랐다. 나는 또한 ejb 서브 모듈에서 자원 어댑터의 종속성을 컴파일하여 제공하도록 전환했다. 이 경우 나는 다음과 같은 오류

[ERROR] Caused by: java.lang.IllegalStateException: WFLYEJB0383: No message listener of type de.bitc.jca.inflow.TcpMessageListener found in resource adapter tcp-eis.rar"}, 
    "WFLYCTL0412: Required services that are not installed:" => ["jboss.deployment.subunit.\"ra-ear.ear\".\"ra-user-ejb-0.0.1-SNAPSHOT.jar \".component.InboundEventHandler.CREATE"], 
    "WFLYCTL0180: Services with missing/unavailable dependencies" => undefined}}} 
다음

자원 어댑터의 설정이 jboss_cli

에 TcpListenerInterface 여기

package de.bitc.jca.inflow; 

/** 
* TcpMessageListener 
* 
* @version $Revision: $ 
*/ 
public interface TcpMessageListener { 
    /** 
    * Receive message 
    * 
    * @param msg 
    *   String. 
    */ 
    public void onMessage(String msg); 
} 

MDB를 여기

package de.bitc.ejb; 

import java.util.logging.Logger; 

import javax.ejb.ActivationConfigProperty; 
import javax.ejb.MessageDriven; 

import org.jboss.ejb3.annotation.ResourceAdapter; 

import de.bitc.jca.inflow.TcpMessageListener; 

@MessageDriven(
    activationConfig = { 
      @ActivationConfigProperty(propertyName = "topic", propertyValue = "test") 
     } //, messageListenerInterface = TcpMessageListener.class 
     ) 
@ResourceAdapter(value="tcp-eis.rar") 
public class InboundEventHandler implements TcpMessageListener { 

    /** The logger */ 
    private static Logger log = Logger.getLogger(InboundEventHandler.class.getName()); 

    /** 
    * Default constructor. 
    */ 
    public InboundEventHandler() { 
     // TODO Auto-generated constructor stub 
    } 

    /** 
    * @see TcpMessageListener#onMessage(String) 
    */ 
    @Override 
    public void onMessage(String msg) { 
     // TODO Auto-generated method stub 
    } 
} 

있습니다입니다

있어
/subsystem=resource-adapters/resource-adapter=tcp-eis.rar:read-resource(recursive=true) 
{ 
    outcome => success, 
    result => { 
     archive => tcp-eis.rar, 
     beanvalidationgroups => undefined, 
     bootstrap-context => undefined, 
     config-properties => undefined, 
     module => undefined, 
     statistics-enabled => false, 
     transaction-support => XATransaction, 
     wm-security => false, 
     wm-security-default-groups => undefined, 
     wm-security-default-principal => undefined, 
     wm-security-domain => other, 
     wm-security-mapping-groups => undefined, 
     wm-security-mapping-required => false, 
     wm-security-mapping-users => undefined, 
     admin-objects => undefined, 
     connection-definitions => undefined 
    } 
} 

제 질문은 MDB가 리소스 어댑터를 찾는 배포 단계에서 누락 된 단계가 있는지입니다. 제 생각에는 이것이 @ResourceAdapter 주석으로 끝났다고 생각하십니까? 대기열 또는 다른 것을 정의해야합니까? 인바운드 자원 어댑터에 대한 자원은 매우 드물고 대부분의 예는 아웃 바운드 자원 어댑터입니다. 미리 감사드립니다.

위의 연결된 inbound-ra-example은 github에서 호스팅됩니다. 필자는 github 프로젝트의 README.md에서 모든 단계를 빌드하고 실행하는 방법을 설명했습니다. 문서를 찾기 위해 같은 문제가있는 다른 사람들을 위해이 예제를 제공하고 싶습니다.

답변

0

클래스로드 NoClassDefFoundError: Failed to link 오류를 해결했으며 지금 실행중인 예제는 많은 열린 질문에 대답합니다. 모든 세부 사항을 내 example에 넣었습니다. 인바운드 리소스 어댑터는 이제 wildfly 10 (WF10)의 귀 아카이브에서 하위 배포로 실행됩니다. IronJacamar codegenerator 인바운드 리소스 어댑터를 생성했습니다. 예제에서 빌드하고 실행하는 모든 단계를 설명했습니다.

주된 실수는 귀 보관소에 jboss-deployment-structure 설명자를 사용하지 않고 ear 보관 파일의 리소스 어댑터 API에 maven 종속성을 사용하는 것입니다. 나는 테스트와 잊어 버리는 동안 귀에 의존성을 두었습니다.

  • 위한 ra.xml 설명이 필요하지는 RA 클래스의 @Connector 주석이 충분하다 : 여기
    <?xml version="1.0" encoding="UTF-8"?> 
    <jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.2"> 
        <ear-subdeployments-isolated>false</ear-subdeployments-isolated> 
        <sub-deployment name="ra-user-ejb.jar"> 
         <dependencies> 
          <module name="deployment.ra-ear.ear.tcp-eis.rar" export="true" /> 
         </dependencies> 
        </sub-deployment> 
    </jboss-deployment-structure> 
    

    내 가장 큰 귀 포함 된 인바운드 RA 답변이 문서가 조금 누설 해결한다.
  • WF10에 추가 구성이 필요하지 않습니다. 대기열, standallone-full.xml 수정 또는 jndi 물건이 없습니다. wildfly-maven-plugin이있는 간단한 배포가 작동합니다.
  • 현재 작동중인 리소스 어댑터가 WF10의 리소스 어댑터로 표시되지 않습니다. 이것은 나를 혼란스럽게하고 나의 연구를 매우 어렵게 만든다.
  • jboss-ejb3.xml 설명자가 필요하지 않습니다. @ResourceAdapter(value="ra-ear.ear#tcp-eis.rar")이면 충분합니다. 주의하십시오. 이것은 eb7이 아닌 jboss 주석입니다. 따라서 예를 들어 어떤 리소스도 찾을 수 없습니다. websphere 또는 tomee.

다음 날에는 예제 자원 어댑터를 full ee7 앱으로 확장하고이 예제가 인바운드 자원 어댑터 문서를 통해 다른 사람들에게 도움이되기를 바랍니다.