我正在使用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 ....和正文(我的消息)。
如何仅发送正文并删除所有这些属性?
答案 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使用者。这将意味着在使用消息时,不会向任何明确无法处理这些属性的使用者发送消息。
您没有说消费者是哪种类型的应用程序。