入站 JCA 适配器的 MDB 侦听器不会在 WildFly 中启动

MDB Listener for inbound JCA adapter doesn't start in WildFly

是否有人设法在 WildFly(9.0.2 或 10.0)中部署了一个监听独立 JCA 适配器的 MDB bean?

我刚刚创建了一个入站 JCA 适配器(使用 ironjacamar-1.2.6)并将其部署在 WildFly 上。像这样:

@Activation(messageListeners = { foo.TestMessageListener.class })
public class TestActivationSpec implements ActivationSpec
...

接下来,我添加了一个简单的连接(使用jboss-cli):

/profile=full-ha/subsystem=resource-adapters/resource-adapter=testRA:add(archive=test.rar,transaction-support=NoTransaction)
/profile=full-ha/subsystem=resource-adapters/resource-adapter=testRA/connection-definitions=TestManagedConnectionFactory:add(class-name=foo.TestManagedConnectionFactory,jndi-name=java:/eis/TestConnectionFactory_ha)

到目前为止很简单。之后,我创建了 WAR 应用程序,其中包含适配器的目标消费者:

@MessageDriven(
    activationConfig = {
            @ActivationConfigProperty(propertyName = "someProperty",
                    propertyValue = "Hi there")}
)
@Vetoed
public class TestServiceConsumer implements TestMessageListener{
...

我遇到了第一个麻烦。此 WAR 在部署期间看不到 TestMessageListener class(顺便说一句,缺少 WildFly 的规范支持)。我通过在我的 WAR 存档中添加一个特殊的专有描述符找到了解决方案:

META-INF/jboss-deployment-structure.xml

<?xml version="1.0" encoding="UTF-8"?>
<jboss-deployment-structure>
    <deployment>
        <dependencies>
            <module name="deployment.test.rar" />
        </dependencies>
    </deployment>
</jboss-deployment-structure>

它解决了 class 加载的问题,我的 WAR classes 可以看到 RAR 界面。但现在我看到其他部署问题:

java.lang.IllegalStateException: WFLYEJB0383: No message listener of type foo.TestMessageListener found in resource adapter activemq-ra

所以,问题是为什么 WildFly 只查看自己的 RA 来获取监听器接口,而不查看我的?有没有其他具体的描述符可以解决这个问题?

需要说明的是,我尝试过将 ra.xml 描述符添加到 RAR 存档中,添加 @ActivationConfigProperty 以指定确切的 RA 连接工厂(destinationLookup 和 connectionFactoryLookup)。没有任何帮助。

我的适配器也实现了出站处理,并且按规定工作。

感谢任何建议。

是的!有一个特殊的描述符可以让它在 WildFly 工作:

jboss-ejb3.xml

<?xml version="1.1" encoding="UTF-8"?>
<jboss:ejb-jar xmlns:jboss="http://www.jboss.com/xml/ns/javaee"
           xmlns="http://java.sun.com/xml/ns/javaee"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xmlns:r="urn:resource-adapter-binding"
           xsi:schemaLocation="http://www.jboss.com/xml/ns/javaee    http://www.jboss.org/j2ee/schema/jboss-ejb3-2_0.xsd http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/ejb-jar_3_1.xsd"
           version="3.1"
           impl-version="2.0">
    <assembly-descriptor>
        <r:resource-adapter-binding>
            <ejb-name>TestServiceConsumer</ejb-name>
            <r:resource-adapter-name>test.rar</r:resource-adapter-name>
        </r:resource-adapter-binding>
    </assembly-descriptor>
</jboss:ejb-jar>

但如果没有另一个它就无法工作,应该将其放入 RAR 压缩包并定义一些默认的托管连接!

META-INF/ironjacamar.xml

<ironjacamar xmlns="http://www.ironjacamar.org/doc/schema"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://www.ironjacamar.org/doc/schema 
         http://www.ironjacamar.org/doc/schema/ironjacamar_1_1.xsd">

    <transaction-support>NoTransaction</transaction-support>

    <connection-definitions>
        <connection-definition class-name="foo.TestManagedConnectionFactory" jndi-name="java:/eis/TestConnectionFactory" pool-name="TestConnectionFactory">
        </connection-definition>
    </connection-definitions>

</ironjacamar>

如果要让这些 J2EE 规范发挥作用需要那么多痛苦和晦涩难懂的知识,为什么我们需要所有这些规范?!

就我而言 none 这些解决方案有所帮助。

但是我在 Red Hat 站点上发现他们提到我们需要查找对 .rar 或其 jar 部署的重复引用。

低看,我的一个 pom 文件同时引用了我的 .rar 文件及其 .jar 文件。 Jboss 6.4 没有问题,但是是的,Wildfly 看起来更严格。无论如何,我只是将他们的范围更改为 provided 并且世界上一切都是正确的。

<scope>provided</scope>