将消息发送到队列时无法删除JMS属性

时间:2020-05-27 13:48:34

标签: ibm-mq spring-jms

我正在使用JMSTemplate和IBM队列管理器发送一条简单消息。

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 个答案:

答案 0 :(得分:2)

您不能;这就是JMS的工作方式;阅读规格。

如果您正在谈论IBM MQ RFH2标头,而使用者是本机MQ应用程序(不是JMS),请参见here

MQRFH2是可选的,它包含在外发消息中由JMS Destination类中的TARGCLIENT标志控制。您可以使用IBM MQ JMS管理工具设置此标志。因为MQRFH2承载JMS特定的信息,所以当发送方知道接收目标是JMS应用程序时,请始终将其包括在消息中。通常,当直接向非JMS应用程序发送消息时,请省略MQRFH2。这是因为这样的应用程序在其IBM MQ消息中不希望使用MQRFH2。

我相信这意味着您将必须发送到Destination对象而不是目的地名称;目标设置了属性:

mqDestination.setTargetClient(WMQConstants.WMQ_CLIENT_NONJMS_MQ);

答案 1 :(得分:1)

您应该阅读目标客户端-参见here

有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)

答案 2 :(得分:1)

您可以将IBM MQ队列管理器上的队列更改为使用PROPCTL(NONE),而不是将targetClient设置为指示MQ使用者。这将意味着在使用消息时,不会向任何明确无法处理这些属性的使用者发送消息。

您没有说消费者是哪种类型的应用程序。