如何配置 Wildfly 连接到 RabbitMQ?

How to configure Wildfly to connect to RabbitMQ?

我在配置 JB EAP7 以使用 RabbitMQ 作为消息代理时遇到困难。 我创建了一个 rabbitmq 模块并将其定义为我的 standalone-ha.xml.

中的全局模块

modules/system/layers/base/com/rabbitmq/main/module.xml:

<module xmlns="urn:jboss:module:1.1" name="com.rabbitmq">
    <resources>
        <resource-root path="rabbitmq-jms-1.7.0.jar"/>
        <resource-root path="amqp-client-4.2.0.jar" />
    </resources>
    <dependencies>
       <module name="javax.api" />
       <module name="javax.transaction.api"/>
       <module name="org.slf4j"/>
    </dependencies>
</module>

JB7 启动没有问题。但我在 server.log 中看到以下内容,表明 MDB 正在尝试绑定到 ActiveMQ 连接(我猜是 Wildfly 中的默认提供程序):

2017-08-29 17:24:09,193 INFO  [org.jboss.as.ejb3]WFLYEJB0042: Started message driven bean 'Subscriber' with 'activemq-ra' resource adapter
2017-08-29 17:24:09,368 INFO  [javax.enterprise.resource.webcontainer.jsf.config]Initializing Mojarra 2.2.12-jbossorg-2  for context '/webapp-0.0.1-SNAPSHOT'
2017-08-29 17:24:09,462 INFO  [org.apache.activemq.artemis.ra]AMQ151000: awaiting topic/queue creation java:/global/mq/kodo
2017-08-29 17:24:10,103 INFO  [org.wildfly.extension.undertow]WFLYUT0021: Registered web context: /webapp-0.0.1-SNAPSHOT
2017-08-29 17:24:10,285 INFO  [org.jboss.as.server]WFLYSRV0010: Deployed "webapp-0.0.1-SNAPSHOT.war" (runtime-name : "webapp-0.0.1-SNAPSHOT.war")
2017-08-29 17:24:10,286 INFO  [org.jboss.as.server]WFLYSRV0010: Deployed "kodo-jdo.rar" (runtime-name : "kodo-jdo.rar")
2017-08-29 17:24:11,465 INFO  [org.apache.activemq.artemis.ra]AMQ151001: Attempting to reconnect org.apache.activemq.artemis.ra.inflow.ActiveMQActivationSpec(ra=org.apache.activemq.artemis.ra.ActiveMQResourceAdapter@78712571 destination=java:/global/mq/kodo destinationType=javax.jms.Queue ack=Auto-acknowledge durable=false clientID=null user=null maxSession=15)

我不确定如何在我的 MDB 中确定我希望 MDB 使用我的 RabbitMQ 定义的 ConnectionFactory。我的 MDB 定义为:

@MessageDriven(
        activationConfig = {
        @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue"),
        @ActivationConfigProperty(propertyName = "destinationLookup", propertyValue = "java:/global/mq/kodo") })
public class Subscriber implements MessageListener {

    public void onMessage(final Message message) {
        try {
            System.out.println(message.getBody(Object.class).toString());
        } catch (JMSException e) {
            // TODO Auto-generated catch block
            throw new RuntimeException(e);
        }
    }
}

但我找不到文档 where/how 来指定 ConnectionFactory。我已经尝试向我的 class 添加 @JMSConnectionFactory( String JNDI) 注释,但我仍然得到相同的结果。

我的 RabbitMQ 模块定义中是否遗漏了什么?我的 MDB 注释不正确吗?我需要做什么才能将我的 MDB 配置为使用我的 RabbitMQ ConnectionFactory 连接到 Message Broker?

如果你想为 MDB 使用另一个代理,你必须更改 Wildfly 配置文件中的配置,该文件仅存在于完整配置文件中,因为 MDB 是 Java EE 完整配置文件的一部分,而不是 Web 配置文件. 例如,此配置在独立-full.xml 文件中可用:

<mdb>
    <resource-adapter-ref resource-adapter-name="${ejb.resource-adapter-name:activemq-ra.rar}"/>
    <bean-instance-pool-ref pool-name="mdb-strict-max-pool"/>
</mdb>

不幸的是,似乎还不能使用 MDB 通过 RabbitMQ JMS Client 连接到 RabbitMQ。 这是因为其中未实现一些可选的 JMS 客户端规范功能。参见 RabbitMQ Jms client compliance page

因此,要使用连接到 RabbitMQ 的消息监听器(如果您不想轮询队列),您可以尝试在 setMessageListener method and CDI. See this answer 的帮助下手动声明它们以获取详细信息。但是我不确定这最后一个是否会在 Wildfly 中实际工作(要在 Wildfly 中测试,从 Java EE Web Profile 开始),根据 javadoc 此方法抛出异常:

if the JMS provider fails to set the MessageConsumer's MessageListener for one of the following reasons: an internal error has occurred or this method has been called in a Java EE web or EJB application (though it is not guaranteed that an exception is thrown in this case)

请注意,要使用 RabbitMQ JMS Client 文档中描述的 Wildfly 配置,您必须使用 1.7.0 版本,因为 此 Pull 请求 启用 Wildfly 配置。

我将尝试分享我在测试 RabbitMQ JMS 客户端集成到 wildfly 时所做的代码