无法将MDB链接到Wildfly 10.x上的入站资源适配器 - 部署失败

时间:2017-10-06 14:23:07

标签: java wildfly-10 jca resource-adapter ironjacamar

我在github上编写了一个简单的tcp入站资源适配器(RA)作为example project,并使用独立完整配置将其成功部署到wildfly 10.x.消息侦听器TcpMessageListener接口位于RA中并在ra.xml描述符中定义,但我无法将消息驱动Bean(MDB)连接到它。 RA的eis端按预期工作,我可以使用telnet连接/发送消息。当我尝试使用wildfly maven插件部署MDB时,MDB找不到TcpMessageListener,我得到了java.lang.NoClassDefFoundError

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注释完成的?我需要定义一个队列还是什么?有关入站资源适配器的资源非常少见,大多数示例都是出站资源适配器。提前谢谢。

上面链接的inbound-ra-example托管在github上。我描述了在github项目中的README.md中构建和运行它的所有步骤。我想将这些示例托管给其他有相同问题的人找到文档。

1 个答案:

答案 0 :(得分:0)

我解决了类加载NoClassDefFoundError: Failed to link错误,现在运行的示例回答了很多未解决的问题。我把所有细节都放到example。入站资源适配器现在作为wildfly 10(WF10)上的ear存档中的子部署运行。我使用IronJacamar codegenerator生成了入站资源适配器。我在示例中描述了构建和运行的所有步骤。

主要的错误,我没有使用ear存档中的jboss-deployment-structure描述符和maven依赖于ear archive中的资源适配器api。我在测试时将依赖放入耳中并忘记了它。

<?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描述符,RA类中的@Connector注释就足够了。
  • WF10中无需额外配置。没有队列,standallone-full.xml修改或jndi的东西。使用wildfly-maven-plugin进行简单部署。
  • 现在正在运行的资源适配器未在WF10中显示为资源适配器。这让我感到困惑,使我的研究变得非常困难。
  • 不需要jboss-ejb3.xml描述符。 @ResourceAdapter(value="ra-ear.ear#tcp-eis.rar")就够了。小心,这是一个jboss注释,而不是ee7。所以你没有找到任何资源,例如。 websphere或tomee。

我将在接下来的几天内将示例资源适配器扩展到一个完整的ee7应用程序,并希望此示例通过入站资源适配器文档地狱帮助其他人。