【发布时间】:2021-08-17 02:46:21
【问题描述】:
我向 MQ 队列 (MQ 7.0.1) 发送一条简单的文本消息: “ABC”
- 使用spring JMS消息总长度为:291
- 但是使用 IBM MQ 库将相同的消息放入队列中,消息的总长度为:3
如何使用 JMS 获得总数据长度 3?
Spring JMS 代码:
@EnableJms
public class JMSTestController {
...
@Autowired
private JmsTemplate jmsTemplate;
@Autowired
JmsMessagingTemplate jmsMessagingTemplate;
...
public String send() throws JMSException{
jmsTemplate.setReceiveTimeout(10000);
jmsMessagingTemplate.setJmsTemplate(jmsTemplate);
Session session = jmsMessagingTemplate.getConnectionFactory().createConnection()
.createSession(false, Session.AUTO_ACKNOWLEDGE);
Queue entryQueue = session.createQueue("hereQueueName");
Queue replyQueue = session.createQueue("hereReplyQueueName");
TextMessage message = session.createTextMessage("abc");
message.setJMSDeliveryMode(DeliveryMode.NON_PERSISTENT);
message.setJMSDestination(entryQueue);
message.setIntProperty(WMQConstants.JMS_IBM_CHARACTER_SET, 819);
message.setIntProperty(WMQConstants.JMS_IBM_ENCODING, 273);
jmsMessagingTemplate.convertAndSend(entryQueue, message);
String messageId = message.getJMSMessageID();
...
}
本机代码:
MQQueueManager qm = createQueueManager(queueManager, host, port,
channel, username, password, connectionType);
MQQueue m_receiver = null;
MQMessage msg = new MQMessage();
msg.format = MQC.MQFMT_STRING;
msg.expiry = timeout / 1000;
msg.replyToQueueName = qReceiver;
msg.replyToQueueManagerName = queueManager;
msg.write("abc".getBytes());
MQPutMessageOptions pmo = new MQPutMessageOptions();
try {
qm.put(qSender, msg, pmo);
} catch (MQException e) {
MQTalkerException ex = new MQTalkerException(
"An error happened sending a message", e);
logger.error(ex);
throw ex;
}
解决方案
根据 JoshMc 的评论,我进行了以下修改并达到了预期的结果:
查看这些答案,您想将 targetClient 设置为 MQ 以删除 那些属性。有很多方法可以做到这一点,改变 您的 CreateQueue 使用 URI 可能是最简单的。 JMS transport v/s MQ transport
也就是说,使用URI来修改队列的创建,而不是仅仅使用它的名字。
Queue entryQueue = session.createQueue("queue:///QUEUE_NAME?targetClient=1");
【问题讨论】:
-
在您的第二个屏幕截图中,您有一个标题为“propiedades con nombres”(“具有名称的属性”)的部分,这可能会解释长度的差异。请您也向我们展示该消息部分的屏幕截图,我们应该能够从那里解释差异。我很惊讶它是具有属性的本机的,而 JMS 的却没有仔细检查您是否以正确的方式使用它们。
-
莫拉格,谢谢您的回复。是真的,我错误地交换了截图:用jms总长度为291。我附上了“带名称的属性”截图。
-
查看这些答案,您想将 targetClient 设置为 MQ 以删除这些属性。有很多方法可以做到这一点,将 CreateQueue 更改为使用 URI 可能是最简单的。 stackoverflow.com/questions/3385576/…
-
@JoshMc,正如您所指出的,更改 createQueue 停止发送“带有名称的属性”。 ¡ 谢谢!
-
额外的 288 字节是 MQRFH2 标头。通过将 targetClient 设置为 MQ,MQ 客户端库不会将 MQRFH2 标头放在消息上。如果您将消息发送到非 JMS 应用程序,那么将 targetClient 设置为 MQ 是正确的方法。
标签: spring-boot jms ibm-mq spring-jms mq