通过JMS将OpenLiberty连接到RabbitMQ

通过JMS将OpenLiberty连接到RabbitMQ,rabbitmq,jms,open-liberty,Rabbitmq,Jms,Open Liberty,我正在编写一个JavaEE8应用程序,希望连接到RabbitMQ总线。该应用程序部署在OpenLiberty中。由于应用程序使用JavaEE8,我想使用JMS连接到RabbitMQ。我以前做过一个概念证明,所以我知道这一定是可能的 根据我找到的文档和博客,我需要一个资源适配器来将OpenLiberty连接到除其内部JMS引擎之外的所有东西。我已经找到了答案,想试一试 My server.xml: beanValidation-2.0 cdi-2.0 jaxrs-2.1 jsp-2.3 serv

我正在编写一个JavaEE8应用程序,希望连接到RabbitMQ总线。该应用程序部署在OpenLiberty中。由于应用程序使用JavaEE8,我想使用JMS连接到RabbitMQ。我以前做过一个概念证明,所以我知道这一定是可能的

根据我找到的文档和博客,我需要一个资源适配器来将OpenLiberty连接到除其内部JMS引擎之外的所有东西。我已经找到了答案,想试一试

My server.xml:


beanValidation-2.0
cdi-2.0
jaxrs-2.1
jsp-2.3
servlet-4.0
jms-2.0
appSecurity-3.0
社交网络1.0
然后,在我的应用程序代码中

@Inject
@JMSConnectionFactory(“jms/JmsFactory”)
私有JMSContext上下文;
只要调用
context.createQueue(“ExampleQueue”)
(或任何方法调用),我就会得到

我还尝试过手动查找,如下所示:

final InitialContext context=new InitialContext();
final-Context-environment=(Context)Context.lookup(“java:comp/env”);
最终QueueConnectionFactory工厂=(QueueConnectionFactory)环境。查找(“jms/JmsFactory”);
final Queue Queue=InitialContext.doLookup(“jms/ExampleQueue”);
这在
环境中失败。使用
javax.naming.NameNotFoundException:java:comp/env/jms/JmsFactory
查找


我做错了什么,或者在这里监督了什么?

Liberty期望如何定义JMS资源适配器与此资源适配器如何定义自身之间存在不匹配。Liberty希望JMS资源适配器使用ra.xml中的JMS类作为接口定义,因此
javax.JMS.ConnectionFactory
。相反,这个RA使用
org.jboss.resource.adapter.jms.JmsConnectionFactory
。在运行时,这是一个
javax.jms.ConnectionFactory
,但不在ra.xml中

有一个简单的解决方法,只需使用JCA connectionFactory元素。我发现以下配置工作正常:

<connectionFactory jndiName="jms/JmsFactory">
   <!-- using .amqp as that is the ID for the resource adapter -->
   <properties.amqp DeleteTemporaryDestinations="true"
       ConnectionFactory="factory1"
       JndiParameters="java.naming.factory.initial=org.apache.qpid.jms.jndi.JmsInitialContextFactory;connectionFactory.factory1=amqp://localhost:5672"              
       UserName=""
       Password="" />
</connectionFactory>


Liberty中存在此问题的bug,但我建议只使用JCA connectionFactory元素即可。

您配置了哪些功能?@Alasdair谢谢您的提问。我已经更新了server.xml代码段。您可以将jndi-1.0添加到功能列表中,看看是否有效吗?@Alasdair我已经启用了jndi-1.0并重新启动了OpenLiberty。我得到了完全相同的例外。我一直在尝试自己,但我没有注射任何东西。我还没弄清楚。
<connectionFactory jndiName="jms/JmsFactory">
   <!-- using .amqp as that is the ID for the resource adapter -->
   <properties.amqp DeleteTemporaryDestinations="true"
       ConnectionFactory="factory1"
       JndiParameters="java.naming.factory.initial=org.apache.qpid.jms.jndi.JmsInitialContextFactory;connectionFactory.factory1=amqp://localhost:5672"              
       UserName=""
       Password="" />
</connectionFactory>