В Wildfly MDB, слушающий внешний ActiveMQ, получает нулевой JMSMessageId - PullRequest
0 голосов
/ 24 июня 2019

Я тестирую соединение Wildfly16 / JBoss 7.2 с ActiveMQ Artemis 2.7.

Я написал простой MDB, и он может принимать сообщения от удаленного сервера ActiveMQ Artemis.

Я правильно получаю полезную нагрузку (текстовое сообщение) и CorrelationId, но полученный MessageId равен нулю! Это выглядит странно и очень раздражает, так как я хочу реализовать запрос / ответ.

  • Чтобы разрешить доступ Wildfly к внешнему серверу ActiveMQ Artemis, я выполнил действия, указанные в 31.3. Настройка адаптера ресурсов Artemis для подключения к Red Hat JBoss AMQ 7 . Это сработало.
  • Я создал простой Java-клиент, который может напрямую отправлять / использовать / просматривать очереди. Когда я получаю сообщение от этого клиента, я получаю MessageId, CorrelationId и все, что я ожидаю.
  • Эта проблема появляется с компонентом Message Driven Bean в Wildfly 16, 17 и JBoss 7.2 (я пробовал каждый).
  • Баночка MDB, которую я развернул на Wildfly, не имеет зависимости (6Kb)

Ниже код MDB

import java.util.Properties;
import java.util.logging.Logger;

import javax.ejb.ActivationConfigProperty;
import javax.ejb.MessageDriven;

import javax.jms.*;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;

import org.jboss.ejb3.annotation.ResourceAdapter;

@ResourceAdapter("activemq-ra-remote")
@MessageDriven(name = "JmsTestMDB", activationConfig = {
        @ActivationConfigProperty(propertyName = "destinationLookup", propertyValue = "testReqQueue"),
        @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue"),
        @ActivationConfigProperty(propertyName = "acknowledgeMode", propertyValue = "Auto-acknowledge")})
public class WildflyMdb implements MessageListener {
  private static final Logger LOGGER = Logger.getLogger(WildflyMdb.class.toString());

  public void onMessage(Message rcvMessage) {
    TextMessage txtMessage = null;
    try {
      if (rcvMessage instanceof TextMessage) {
    txtMessage = (TextMessage) rcvMessage;
       LOGGER.info("Received Message from queue: MessageId=" + rcvMessage.getJMSMessageID() + 
                   ", CorrelationId=" + rcvMessage.getJMSCorrelationID() +
                   ", Text='" + txtMessage.getText() + "'");

       LOGGER.info("rcvMessage (toString): " + rcvMessage.toString());

    } catch (Exception e) {
       LOGGER.severe("EXCEPTION:" + e.getMessage());
    }
 }

Когда я отправляю следующее сообщение с моим клиентом Java:

  • Код сообщения: ID: DEVTEMP-PC-49242-1561392550500-1: 1: 1: 1: 1
  • Идентификатор корреляции: CID: 20190624180910
  • Текстовое сообщение: «Это мое тестовое сообщение»

Я получаю следующий журнал из MDB в Wildfly:

16:23:29,694 INFO  [class com.fluide.mdb.WildflyMdb] (Thread-360 (ActiveMQ-client-global-threads)) Received Message from queue: MessageId=null, CorrelationId=CID:20190624180910, Text='This is my test message'
16:23:29,695 INFO  [class com.fluide.mdb.WildflyMdb] (Thread-360 (ActiveMQ-client-global-threads)) rcvMessage (toString): ActiveMQMessage[null]:PERSISTENT/ClientMessageImpl[messageID=946860, durable=true, address=testReqQueue,userID=null,properties=TypedProperties[__AMQ_CID=ID:DEVTEMP-PC-49242-1561392550500-0:1,_AMQ_GROUP_SEQUENCE=0,__HDR_BROKER_IN_TIME=1561392550749,_AMQ_ROUTING_TYPE=1,__HDR_ARRIVAL=0,__HDR_REPLY_TO=[0000 0011 6401 000D 7465 7374 5265 7370 5175 6575 65),__HDR_COMMAND_ID=5,JMSCorrelationID=CID:20190624180910,__HDR_PRODUCER_ID=[0000 0039 7B01 0025 4944 3A44 4556 5445 4D50 2D50 432D 3439 3234 322D 3135  ... 31 3339 3235 3530 3530 302D 313A 3100 0000 0000 0000 0100 0000 0000 0000 01),__HDR_MESSAGE_ID=[0000 004C 6E00 017B 0100 2549 443A 4445 5654 454D 502D 5043 2D34 3932 3432  ...  0000 0000 0001 0000 0000 0000 0001 0000 0000 0000 0001 0000 0000 0000 0000),__HDR_DROPPABLE=false]]

Как видите, MessageId возвращается как null , что выглядит неправильно. Есть идеи?

Ответы [ 2 ]

0 голосов
/ 25 июня 2019

Поскольку вы отправляете сообщение с помощью автономного Java-клиента с использованием протокола OpenWire от activemq-all-5.12.0.jar и получаете сообщение с MDB по Wildfly / EAP с использованием основного протокола Artemis, я полагаю, что вы нажали об этой ошибке в ActiveMQ Artemis, который заставляет сообщения, отправленные и полученные по различным протоколам, иметь нулевой идентификатор сообщения. Пул-запрос уже отправлен, поэтому проблема должна быть исправлена ​​в версии 2.10.0.

Если вы не хотите ждать выхода версии 2.10.0, вы можете обойти эту проблему, используя базовую реализацию JMS-клиента Artemis из автономного Java-приложения. Просто вставьте jar-клиент Artemis (из каталога / lib / client) и измените исходную фабрику контекста на org.apache.activemq.artemis.jndi.ActiveMQInitialContextFactory.

0 голосов
/ 24 июня 2019

EAP 7.2 на Artemis 2.x, так что вам не нужно делать это таким образом.Вы можете использовать простую, хорошо сконфигурированную фабрику пула соединений на уровне подсистемы: http://wildscribe.github.io/WildFly/16.0/subsystem/messaging-activemq/pooled-connection-factory/index.html

...