Spring boot spring JMS和本机IBM MQ库之间的消息总长度差异

Spring boot spring JMS和本机IBM MQ库之间的消息总长度差异,spring-boot,jms,ibm-mq,spring-jms,mq,Spring Boot,Jms,Ibm Mq,Spring Jms,Mq,我向MQ队列(MQ 7.0.1)发送一条简单的文本消息: “abc” 使用SpringJMS,消息的总长度为:291 但是使用IBM MQ库将相同的消息放入队列中,消息的总长度为:3 如何使用JMS获得总数据长度3 Spring JMS代码: @EnableJms public class JMSTestController { ... @Autowired private JmsTemplate jmsTemplate; @Autowired JmsMessagingTemp

我向MQ队列(MQ 7.0.1)发送一条简单的文本消息: “abc”

  • 使用SpringJMS,消息的总长度为: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以删除 那些财产。有很多方法可以实现这一点,改变 使用URI的CreateQueue可能是最简单的。

也就是说,使用URI而不仅仅是其名称来修改队列的创建

Queue entryQueue = session.createQueue("queue:///QUEUE_NAME?targetClient=1");
Queue entryQueue = session.createQueue("queue:///QUEUE_NAME?targetClient=1");

Spring正在计算消息体的字节数(aka data)

IBM MQ native正在计算消息头和正文的字节数

在屏幕截图中,正上方的字段显示“3”字节

纵向数据=主体长度=3


Longitud total=页眉长度+正文=291

我根据JoshMc的意见得出了解决方案。也就是说,使用URI而不仅仅是其名称来修改队列的创建

Queue entryQueue = session.createQueue("queue:///QUEUE_NAME?targetClient=1");
Queue entryQueue = session.createQueue("queue:///QUEUE_NAME?targetClient=1");
这将删除MQRFH2头(我不知道它们来自何处的额外字节)
消息的总长度为3个字节。

在第二个屏幕截图中,您有一个标题为“propiedades con nombres”(“带名称的属性”)的部分,这可能会解释长度的差异。请你也给我们看一段信息的屏幕截图,然后我们就可以解释其中的区别了。我感到惊讶的是,它是本地的一个有属性,而JMS的一个没有属性,所以也要仔细检查它们是否正确。Morag,谢谢你的回复。的确,我错误地交换了截图:使用jms,总长度为291。我附加了“带名称的属性”屏幕截图。请查看这些答案,您想将targetClient设置为MQ以删除这些属性。实现这一点的方法有很多,将CreateQueue更改为使用URI可能是最简单的方法@JoshMc,正如您所指出的,更改createQueue停止发送“带名称的属性”。“谢谢!额外的288字节是MQRFH2头。通过将targetClient设置为MQ,MQ客户端库不会将MQRFH2头放在消息上。如果要将消息发送到非JMS应用程序,则将targetClient设置为MQ是正确的方法。屏幕截图均来自MQ资源管理器。消息的内容是不同的。一个包含属性,另一个不包含。发布连接工厂设置--您有targetClient或属性控制设置吗?