Правильный способ написания спецификации активации в Open Liberty для Apache Qpid для служебной шины Azure

Я успешно настроил клиент Apache Qpid JMS (0.41.0) в Open Liberty для отправки сообщений в очередь служебной шины Azure.

Мой server.xml выглядит так:

<jndiObjectFactory id="servicebusfactory" libraryRef="qpidlibsid"
   className="org.apache.qpid.jms.jndi.JNDIReferenceFactory" 
   objectClassName="org.apache.qpid.jms.JmsConnectionFactory">
</jndiObjectFactory>

<jndiReferenceEntry id="qpidconnectionfactory" 
  jndiName="jms/ServiceBus" 
  factoryRef="servicebusfactory">
  <properties remoteURI="amqps://xxx.servicebus.windows.net?amqp.idleTimeout=120000&amp;amqp.traceFrames=true&;jms.username=xxxx&amp;jms.password=xxx"/>
</jndiReferenceEntry>

<jndiObjectFactory id="queuefactory" libraryRef="qpidlibsid"
  className="org.apache.qpid.jms.jndi.JNDIReferenceFactory" 
  objectClassName="org.apache.qpid.jms.JmsQueue">
</jndiObjectFactory>

<jndiReferenceEntry id="myqueue" 
  jndiName="jms/myqueue" 
  factoryRef="queuefactory">
   <properties address="myqueue" />
</jndiReferenceEntry>

Используя приведенную выше конфигурацию сервера, я могу без проблем отправлять сообщения в очередь служебной шины (используя производителя сообщений JMS).

Проблема заключается в получении сообщений с использованием bean-компонента, управляемого сообщениями. Я пробовал эту конфигурацию:

@MessageDriven(name = "processorMDB", activationConfig = {
    @ActivationConfigProperty(propertyName = "destinationLookup", propertyValue = "jms/myqueue"),
    @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue"),
    @ActivationConfigProperty(propertyName = "acknowledgeMode", propertyValue = "Auto-acknowledge"),
    @ActivationConfigProperty(propertyName = "connectionFactoryLookup", propertyValue = "jms/ServiceBus"),
})

Я получаю предупреждение при запуске Open Liberty:

[ПРЕДУПРЕЖДЕНИЕ ] CNTR4016W: Невозможно активировать конечную точку сообщения для компонента, управляемого сообщениями, CPUPMDB, поскольку место назначения jms/myqueue недоступно. Конечная точка сообщения не будет получать сообщения, пока место назначения не станет доступным.

Я предполагаю, что мне нужна какая-то спецификация активации, но я не могу заставить ее работать правильно.

Приветствуются помощь или объяснение того, как использовать спецификацию активации в Open Liberty!


person Daniel    schedule 06.05.2019    source источник


Ответы (2)


Вы правы в том, что вам нужно настроить спецификацию активации JMS. Для этого вам необходимо установить адаптер ресурсов JMS, для которого требуется функция jms-2.0,

 <featureManager>
  <feature>jms-2.0</feature>
  <feature>mdb-3.2</feature>
  ... other features
 </featureManager>

 <resourceAdapter id="myJMSResourceAdapter" location="C:/adapters/jmsRA.rar"/>

 <jmsActivationSpec id="processorMDB">
   <properties.myJMSResourceAdapter .../>
 </jmsActivationSpec>

 <jmsQueue jndiName="jms/myqueue">
   <properties.myJMSResourceAdapter .../>  
 </jmsQueue>
person njr    schedule 06.05.2019
comment
Где я могу найти подходящий ресурсный адаптер? Я думал, что Apache Qpid обеспечивает то, что нужно, и действует как адаптер ресурсов. Кроме того, разве Open Liberty не предоставляет для этого необходимую реализацию? Меня немного смущают движущиеся части здесь :-) - person Daniel; 06.05.2019
comment
Это похоже на ссылку на их адаптер ресурсов в Maven, mvnrepository.com/artifact/ org.apache.qpid/qpid-ra - person njr; 06.05.2019

Я никогда не заставлял MDB работать.

Я использовал обычный MessageListener в JMSConsumer, и он прекрасно работает, хотя в Javadoc указано следующее:

Этот метод нельзя использовать в веб-приложении Java EE или EJB-приложении. Это может привести к возникновению JMSRuntimeException, хотя это не гарантируется.

Код:

@Singleton
@Startup
public class CreditProcessorBeanListener {

@Resource(name = "jms/ServiceBus")
private ConnectionFactory connectionFactory;

@Resource(name = "jms/myqueue")
private Queue myqueue;
private JMSContext context;
private JMSConsumer consumer;


@PostConstruct
private void init() {
    initListener();
}

private void initListener() {
    context = connectionFactory.createContext();
    consumer = context.createConsumer(myqueue);
    consumer.setMessageListener(new MyListener());

}

@PreDestroy
private void destroy() {
    consumer.close();
    context.close();
}
}

Почему использование MessageListener в JMSConsumer не разрешено в JavaEE? Есть комментарии по этому поводу?

person Daniel    schedule 07.05.2019