如何配置 Wildfly 连接到 RabbitMQ?

Posted

技术标签:

【中文标题】如何配置 Wildfly 连接到 RabbitMQ?【英文标题】:How to configure Wildfly to connect to RabbitMQ? 【发布时间】:2018-02-07 14:40:42 【问题描述】:

我在配置 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);
        
    

但我找不到在哪里/如何指定 ConnectionFactory 的文档。我尝试向我的班级添加 @JMSConnectionFactory( String JNDI) 注释,但仍然得到相同的结果。

我的 RabbitMQ 模块定义中是否缺少某些内容?我的 MDB 没有正确注释吗?为了配置我的 MDB 以使用我的 RabbitMQ ConnectionFactory 连接到 Message Broker,我需要做什么?

【问题讨论】:

【参考方案1】:

如果您想为 MDB 使用另一个代理,您必须更改 Wildfly 配置文件中的配置,该配置文件仅存在于完整配置文件中,因为 MDB 是 Java EE 完整配置文件的一部分,而不是 Web 配置文件的一部分。 例如,此配置在standalone-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 方法和 CDI 的帮助下手动声明它们。有关详细信息,请参阅this answer。但是我不确定最后一个是否真的可以在 Wildfly 中工作(将在 Wildfly 中从 Java EE Web Profile 开始进行测试),根据 javadoc,此方法会引发异常:

如果 JMS 提供程序由于以下原因之一未能设置 MessageConsumer 的 MessageListener: 发生内部错误或 此方法已在 Java EE Web 或 EJB 应用程序中调用(尽管在这种情况下不保证会引发异常)

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

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

【讨论】:

谢谢。我放弃了 MDB 的想法,只使用消息侦听器和 CDI(从standalone-ha.xml 中检索 ConnectionFactory 和 Queue 定义)。 现在,我遇到了自动恢复问题,或者如何使用 JMS 客户端处理超时。见***.com/q/46007414/827480你有没有想过如何处理JMS客户端的异常处理? 这在技术上是否可以在 JMS 客户端中实现,或者 AMQP 本身无法满足 JMS 中的某些 MDB 要求?我们正在谈论的具体 JMS 功能是什么? RabbitMQ JMS Compliance page 中列出的所有功能都可以添加到 RabbitMQ JMS 客户端。这些特性将允许使用 RabbitMQ JMS 客户端启用 JEE MDB。没有它,也可以使用 AMQP 实现 JCA 资源适配器,这将在 JEE 应用程序中启用 MDB,例如 ActiveMQ Resource adapter(TomEE 的文档)。目前,RabbitMQ 只为 JEE 应用提供了部分 JMS 实现,没有提供资源适配器。 有没有人通过 AMQP 将 RabbitMQ 与使用 ActiveMQ 资源适配器的 MDB 连接的公开示例?

以上是关于如何配置 Wildfly 连接到 RabbitMQ?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Windows server 2012 上连接到端口 8080 wildfly?

如何使用 WildFly 连接到受 Kerberos 保护的 Apache Phoenix 数据源?

无法从 WildFly 连接到 HBase

无法从 Wildfly 连接到 SQL Server 数据库

无法连接到 Dockerfile 中的 Wildfly

Wildfly-Swarm 并通过资源适配器连接到外部 activemq:WFLYCTL0412