2017-08-30 134 views
2

我有困难的配置JB EAP7使用RabbitMQ的消息代理。 我创建了一个rabbitmq模块,并将其定义为我的standalone-ha.xml中的全局模块。如何配置Wildfly以连接到RabbitMQ?

模块/系统/层/基层/ COM/RabbitMQ的/主/ 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([email protected]71 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,我需要做些什么?

回答

2

如果你想使用其他经纪人多边开发银行,你必须改变在Wildfly配置文件中的配置,只存在完整的个人资料,如MDB是Java EE完整的个人资料,而不是网络配置文件的一部分。 这种配置例如在独立-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> 

不幸的是,这似乎是不可能使用多边开发银行还通过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配置,您有t o使用1.7.0版本,因为this Pull request启用Wildfly配置。

我会尽力分享我测试RabbitMQ JMS客户端时所做的一段代码,以便wildfly

+0

谢谢。我放弃了MDB的想法,并且只使用消息侦听器和CDI(从standalone-ha.xml中检索ConnectionFactory和Queue定义)。 –

+0

现在,我遇到了自动恢复问题,或者如何使用JMS客户端处理超时。请参阅https://stackoverflow.com/q/46007414/827480你有没有想过如何处理JMS客户端的异常处理? –

+0

技术上可以在JMS客户端中实现,还是AMQP本质上无法满足JMS中的某些MDB要求?我们谈论的具体JMS功能是什么? –