spring-boot - Spring JMS 和本机 IBM MQ 库之间总消息长度的差异
问题描述
我向 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 传输与 MQ 传输
也就是说,使用 URI 而不仅仅是其名称来修改队列的创建。
Queue entryQueue = session.createQueue("queue:///QUEUE_NAME?targetClient=1");
解决方案
我按照 JoshMc 的评论找到了解决方案。也就是说,使用 URI 而不仅仅是其名称来修改队列的创建。
Queue entryQueue = session.createQueue("queue:///QUEUE_NAME?targetClient=1");
这将删除 MQRFH2 标头(我不知道它们来自哪里的额外字节),并且消息的总长度为 3 个字节。
推荐阅读
- javascript - 使用 HTTPS 时,当我使用 XHR 将文件传输到 S7 嵌入式 Web 服务器时,Chrome 会阻止文件传输
- python - 在 Pandas 中按计数分组
- python - 我无法仅在模板中将布尔字段设置为 true 的情况下显示帖子
- bash - 如何在 Bash 中提出一个可以阅读给出的任何问题的问题?
- jquery - jQuery函数调用找不到目标函数
- javascript - 如何在 JavaScript 中交换二维数组中的两个元素?(对我从 Chrome 中的 console.log 看到的内容感到困惑)
- java - JPA by Object 中使用不是@Id 的属性的对象
- python - df.round Python Pandas
- java - 将转换(删除和创建)的文件与 git 进行比较
- ios - 如何检测 iPad 上的智能/外接键盘?