spring JMS 和本机 IBM MQ 库之间总消息长度的差异
Differences in total message length between spring JMS and native IBM MQ libraries
我向 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 的评论,我进行了以下修改并达到了预期的结果:
Check out these answers, you want to set targetClient to MQ to remove
those properties. There are many ways to accomplish this, changing
your CreateQueue to use a URI is probably the easiest.
JMS transport v/s MQ transport
也就是说,使用 URI 而不仅仅是其名称来修改队列的创建。
Queue entryQueue = session.createQueue("queue:///QUEUE_NAME?targetClient=1");
Spring 正在计算消息的字节数 body(又名 data)
IBM MQ 本机正在计算消息的字节数 headers 加上 body
在您的屏幕截图中,正上方的字段显示“3”字节。
经度数据 = body 的长度 = 3
经度总计 = headers + body = 291
的长度
我按照 JoshMc 的评论找到了解决方案。也就是说,使用 URI 而不仅仅是其名称来修改 queue 的创建。
Queue entryQueue = session.createQueue("queue:///QUEUE_NAME?targetClient=1");
这会删除 MQRFH2 header(我不知道它们来自哪里的额外字节)
消息的总长度为 3 个字节。
我向 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 的评论,我进行了以下修改并达到了预期的结果:
Check out these answers, you want to set targetClient to MQ to remove those properties. There are many ways to accomplish this, changing your CreateQueue to use a URI is probably the easiest. JMS transport v/s MQ transport
也就是说,使用 URI 而不仅仅是其名称来修改队列的创建。
Queue entryQueue = session.createQueue("queue:///QUEUE_NAME?targetClient=1");
Spring 正在计算消息的字节数 body(又名 data)
IBM MQ 本机正在计算消息的字节数 headers 加上 body
在您的屏幕截图中,正上方的字段显示“3”字节。
经度数据 = body 的长度 = 3
经度总计 = headers + body = 291
的长度我按照 JoshMc 的评论找到了解决方案。也就是说,使用 URI 而不仅仅是其名称来修改 queue 的创建。
Queue entryQueue = session.createQueue("queue:///QUEUE_NAME?targetClient=1");
这会删除 MQRFH2 header(我不知道它们来自哪里的额外字节) 消息的总长度为 3 个字节。