2017-10-06 98 views
1

我在github上編寫了一個簡單的tcp入站資源適配器(RA),作爲example project,併成功將其部署到wildfly 10.x,其中包含standalone-full組態。消息監聽器TcpMessageListener接口位於RA中,並在ra.xml描述符中定義,但我無法將消息驅動Bean(MDB)連接到它。 RA的eis一邊按預期工作,我可以用telnet連接/發送消息給它。當我嘗試用wildfly Maven插件部署MDB,對MDB找不到TcpMessageListener和我java.lang.NoClassDefFoundError無法將MDB鏈接到Wildfly 10.x上的入站資源適配器 - 部署失敗

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的Maven子模塊的依賴性是在provided範圍。我跟着部署了RA redhat guide。我還將ejb子模塊中的資源適配器的Maven依賴關係從提供的代碼切換到了編譯。在這種情況下,我得到了以下錯誤

[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}}} 

這裏是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 
    } 
} 

這裏是TcpListenerInterface

package de.bitc.jca.inflow; 

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

這裏是在jboss_cli

資源適配器的設置
/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註釋完成的?我需要定義一個隊列還是什麼?有關入站資源適配器的資源非常少見,大多數示例都是出站資源適配器。提前致謝。

上面鏈接的入站ra示例託管在github上。我描述了在github項目的README.md中構建和運行它的所有步驟。我想爲其他具有相同問題的人找到文檔來舉辦這些示例。

回答

0

我解決了類加載NoClassDefFoundError: Failed to link錯誤,現在運行的例子回答了許多未解決的問題。我把所有的細節都放到了我的example。入站資源適配器現在作爲wildfly 10(WF10)上耳朵歸檔中的子部署運行。我使用IronJacamar codegenerator生成了入站資源適配器。我描述了在示例中如何構建和運行的所有步驟。

主要的錯誤在於,我沒有在耳朵檔案中使用jboss-deployment-structure描述符,並且在耳朵檔案中使用了對資源適配器API的maven依賴。我在測試時將依賴項放入耳中,並將其忘記。

<?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的答案來解決文檔泄露一點點:

  • 是不需要的ra.xml描述符中,@Connector標註在RA類是不夠的。
  • 在WF10中沒有額外的配置需要。沒有隊列,standallone-full.xml修改或jndi的東西。使用wildfly-maven插件進行簡單部署就可以工作。
  • 現在工作的資源適配器在WF10中沒有顯示爲資源適配器。這使我困惑,並使我的研究非常困難。
  • jboss-ejb3.xml描述符不是必需的。 @ResourceAdapter(value="ra-ear.ear#tcp-eis.rar")就夠了。注意,這是一個jboss註釋,而不是ee7。所以你沒有找到任何資源,例如。 websphere或者tomee。

我將在接下來的幾天將示例資源適配器擴展爲完整的ee7應用程序,並希望此示例可幫助其他人在通過入站資源適配器文檔地獄的途中幫助其他人。