Невозможно удалить свойства JMS при отправке сообщения в очередь - PullRequest
1 голос
/ 27 мая 2020

Я отправляю простое сообщение, используя JMSTemplate и IBM queue manager.

public void sendSomething(String message) throws JMSException {
    jmsTemplate.convertAndSend(""queue:///MYQUEUE?targetClient=1"","my message");
  }

Я отлаживал библиотеку шаблонов jms и обнаружил, что в последнем методе, отвечающем за отправку сообщения:

protected void doSend(MessageProducer producer,
                      Message message)
               throws JMSException

...
producer.send(message);
...

сообщение имеет множество свойств, таких как JMSMessage, JMSType, JMSDeliveryMode .... и тело (мое сообщение).

Как я могу отправить только тело и удалить все эти свойства?

Ответы [ 3 ]

2 голосов
/ 27 мая 2020

Вы не можете; так работает JMS; прочтите spe c.

Если вы говорите о заголовках IBM MQ RFH2, а потребителем является собственное приложение MQ (не JMS), см. здесь .

MQRFH2 является необязательным, и его включение в исходящее сообщение регулируется флагом TARGCLIENT в классе назначения JMS. Этот флаг можно установить с помощью инструмента администрирования IBM MQ JMS. Поскольку MQRFH2 переносит специфичную для JMS информацию c, всегда включайте ее в сообщение, если отправитель знает, что получателем является приложение JMS. Обычно опускайте MQRFH2 при отправке сообщения напрямую в приложение, не поддерживающее JMS. Это связано с тем, что такое приложение не ожидает MQRFH2 в своем сообщении IBM MQ.

Я считаю, что это означает, что вам придется отправить объект Destination, а не имя назначения; с получателем, имеющим набор свойств:

mqDestination.setTargetClient(WMQConstants.WMQ_CLIENT_NONJMS_MQ);
1 голос
/ 28 мая 2020

Вместо того, чтобы настраивать targetClient для указания потребителя MQ, вы можете вместо этого изменить очередь в диспетчере очередей IBM MQ, чтобы использовать PROPCTL(NONE). Это будет означать, что любые потребители, которые специально не могут обрабатывать свойства, не получают их, когда они потребляют сообщение.

Вы не говорите, какой тип приложения является потребителем.

1 голос
/ 27 мая 2020

Вы должны прочитать о целевом клиенте - см. здесь .

Есть 3 способа решить вашу проблему:

(1) Используйте метод setTargetClient и MQ удалит все заголовки JMS (также известные как заголовки MQRFH2) и доставит только полезную нагрузку

conn = mqQCF.createQueueConnection("MyUserId", "mypwd");
conn.start();
session = conn.createQueueSession(false, javax.jms.Session.AUTO_ACKNOWLEDGE);
myQ = session.createQueue("my.test.queue");
MQDestination mqd = (MQDestination) myQ;
mqd.setTargetClient(WMQConstants.WMQ_CLIENT_NONJMS_MQ);

(2) Явно установите имя очереди MQ и целевого клиента (1 для MQ и 0 для сообщения JMS) и MQ удалит все заголовки JMS (также известные как заголовки MQRFH2) и доставит только полезную нагрузку

conn = mqQCF.createQueueConnection("MyUserId", "mypwd");
conn.start();
session = conn.createQueueSession(true, 0);
queue = queueSession.createQueue("queue://MQA1/TEST.Q1?targetClient=1");
sender = queueSession.createSender(queue);

(3) Установите целевой клиент в MQ JNDI, и MQ удалит все заголовки JMS (также известные как заголовки MQRFH2) и доставит только полезная нагрузка

DEFINE Q(my.test.queue) QUEUE(TEST.Q1) QMANAGER(MQA1) TARGCLIENT(MQ) FAILIFQUIESCE(YES)
...