Search code examples
spring-bootjmsibm-mqspring-jmsmq

Differences in total message length between spring JMS and native IBM MQ libraries


I send a simple text message to an MQ Queue (MQ 7.0.1): "abc"

  • Using spring JMS the total length of the message is: 291 spring jms total length

spring jms properties with names

  • But putting the same message in the queue using IBM MQ libraries the total length of the message is: 3 ibm mq libraries total length

How can I get total data length 3 with JMS?

Spring JMS code:

@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();
    ...    

}

Native code:

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;
}

Solution

Following JoshMc's comment I made the following modification and reached the expected result:

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

That is, modify the creation of the queue using the URI instead of just its name.

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

Solution

  • I reached the solution by following JoshMc's comment. That is, modify the creation of the queue using the URI instead of just its name.

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

    This removes the MQRFH2 header (the extra bytes I didn't know where they came from) and with that the message has a total length of 3 bytes.