Подключите OpenLiberty к RabbitMQ через JMS

Я пишу приложение Java EE 8, которое хочу подключить к шине RabbitMQ. Приложение развернуто в OpenLiberty. Поскольку приложение использует Java EE 8, я хочу использовать JMS для подключения к RabbitMQ. Ранее я подключился к RabbitMQ через JMS в Tomcat в качестве доказательства концепции, поэтому я знаю, что это должно быть возможно.

Согласно документации и блогам, которые я нашел, мне нужен адаптер ресурсов, чтобы подключить OpenLiberty практически ко всему, кроме внутреннего JMS-движка. Я нашел адаптер ресурсов AMQP 1.0 и хотел попробовать его.

Мой сервер.xml:

<featureManager>
  <feature>beanValidation-2.0</feature>
  <feature>cdi-2.0</feature>
  <feature>jaxrs-2.1</feature>
  <feature>jsp-2.3</feature>
  <feature>servlet-4.0</feature>
  <feature>jms-2.0</feature>

  <feature>appSecurity-3.0</feature>
  <feature>socialLogin-1.0</feature>
</featureManager>

<!-- the resource-adapter-1.0.0.rar comes from the aforementioned GitHub project -->
<resourceAdapter id="amqp" location="${server.config.dir}/resource-adapter-1.0.0.rar">
  <classloader apiTypeVisibility="+third-party"/>
</resourceAdapter>

<jmsConnectionFactory jndiName="jms/JmsFactory">
  <!-- using .amqp as that is the ID for the resource adapter -->
  <properties.amqp ConnectionFactory=""
                   JndiParameters=""
                   DeleteTemporaryDestinations="true"
                   UserName=""
                   Password="" />
</jmsConnectionFactory>

Затем в моем коде приложения у меня есть

@Inject
@JMSConnectionFactory("jms/JmsFactory")
private JMSContext context;

Как только я вызываю context.createQueue("ExampleQueue") (или любой другой вызов метода), я получаю

javax.naming.NameNotFoundException: Intermediate context does not exist: jms/JmsFactory

Я также пытался выполнить поиск вручную, например:

final InitialContext context = new InitialContext();
final Context environment = (Context) context.lookup("java:comp/env");

final QueueConnectionFactory factory = (QueueConnectionFactory) environment.lookup("jms/JmsFactory");
final Queue queue = InitialContext.doLookup("jms/ExampleQueue");

Это терпит неудачу в environment.lookup с javax.naming.NameNotFoundException: java:comp/env/jms/JmsFactory.

Что я делаю неправильно или наблюдаю здесь?


person mthmulders    schedule 27.04.2020    source источник
comment
какие функции у вас настроены?   -  person Alasdair    schedule 04.05.2020
comment
@Alasdair Спасибо за вопрос. Я обновил фрагмент server.xml.   -  person mthmulders    schedule 04.05.2020
comment
Можете ли вы добавить jndi-1.0 в список функций и посмотреть, работает ли это?   -  person Alasdair    schedule 04.05.2020
comment
@Alasdair Я включил jndi-1.0 и перезапустил OpenLiberty. Я получаю точно такое же исключение.   -  person mthmulders    schedule 04.05.2020
comment
Я пробовала сама, но мне вообще ничего не кололи. Не докопался до сути.   -  person Alasdair    schedule 04.05.2020


Ответы (1)


Существует несоответствие между тем, как Liberty ожидает определения адаптера ресурсов JMS, и тем, как этот адаптер ресурсов определяет себя. Liberty ожидает, что адаптер ресурсов JMS будет использовать классы JMS в ra.xml в качестве определения интерфейса, поэтому 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 есть ошибка для этой проблемы 12088, но я бы посоветовал просто используя элемент JCA connectionFactory, чтобы начать работу.

person Alasdair    schedule 08.05.2020