Jakarta ee 如何配置Wildfly以连接到RabbitMQ?

Jakarta ee 如何配置Wildfly以连接到RabbitMQ?,jakarta-ee,rabbitmq,jms,wildfly,message-driven-bean,Jakarta Ee,Rabbitmq,Jms,Wildfly,Message Driven Bean,我在配置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> <resourc

我在配置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>
我不确定如何在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(stringjndi)
注释添加到我的类中,但仍然得到相同的结果


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

如果要为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客户机规范特性。看

因此,要使用连接到RabbitMQ的消息侦听器(如果您不想轮询队列),可以尝试在方法和CDI的帮助下手动声明它们。有关详细信息,请参阅。但是,我不确定最后一个方法在Wildfly中是否有效(将在Wildfly中测试,该方法从Java EE Web概要文件开始),根据javadoc,该方法引发了一个异常:

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

请注意,要使用文档中描述的Wildfly配置,必须使用1.7.0版本,如enable Wildfly配置


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

谢谢。我放弃了MDB的想法,只使用消息侦听器和CDI(从独立的ha.xml检索ConnectionFactory和队列定义)。现在,我在自动恢复方面遇到了问题,或者如何使用JMS客户端处理超时。请看,您是否已经了解了如何处理JMS客户端的异常处理?这在技术上是否可以在JMS客户端中实现,或者AMQP是否天生就无法满足JMS中的某些MDB需求?我们讨论的特定JMS特性是什么?中列出的所有特性都可以添加到RabbitMQ JMS客户端。这些特性允许使用RabbitMQ JMS客户端启用JEE MDB。如果没有这一点,还可以使用AMQP实现JCA资源适配器,这将在JEE应用程序中启用MDB,例如(TOME文档)。目前,RabbitMQ仅为JEE应用程序提供部分JMS impl,没有资源适配器。是否有人使用ActiveMQ资源适配器通过AMQP将RabbitMQ与MDB连接的公开示例?
<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>