Welcome to Jonic Developer Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
550 views
in Technique[技术] by (71.8m points)

java - Setting IBM MQ custom property in JMS doesn't work

Tried setting an IBM MQ custom property in JMS while sending messages. It doesn't work.

I'm looking for an equivalent of the following in JMS/Apache camel.

mQMessage.setStringProperty( "customProperty", "123" );

Tried the following 3 options:

1) exchange.getIn().setHeader( "customProperty", "123" );
2) exchange.getIn().setProperty( "customProperty", "123" );
3) mQQueueConnectionFactory.setStringProperty( "customProperty", "123" );

The following code to read the property throws error because the property doesn't exist it seems. mQMessage.getStringProperty( "messageGlobalSequenceNumber" )

throws the following error:

com.ibm.mq.MQException: MQJE001: Completion Code '2', Reason '2471'.
        at com.ibm.mq.MQMessage.getProperty(MQMessage.java:5694)
        at com.ibm.mq.MQMessage.getStringProperty(MQMessage.java:6949)
        at com.ibm.mq.MQMessage.getStringProperty(MQMessage.java:6925)
...

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)

Are you sure that the property that you are trying to retrieve actually exists for that message? Because Reason Code of 2471 (MQRC_PROPERTY_NOT_AVAILABLE) clearly says that the named property does not exist.

The correct way to create a message property in JMS (for IBM MQ) is as follows:

/**
 * Send a message to a queue.
 * @param session
 * @param myQ
 * @throws JMSException
 */
private void sendMsg(QueueSession session, Queue myQ) throws JMSException
{
   QueueSender sender = null;

   try
   {
      TextMessage msg = session.createTextMessage();
      msg.setText("This is a test message.");
      msg.setStringProperty("MyProp01", "somevalue");

      sender = session.createSender(myQ);
      sender.send(msg);
   }
   finally
   {
      try
      {
         if (sender != null)
            sender.close();
      }
      catch (Exception ex)
      {
         System.out.println("sender.close() : " + ex.getLocalizedMessage());
      }
   }
}

Did you use an MQ tool to check the property values of the message? I ran the above code then checked the message on the queue with MQ Visual Edit and here is a screen-shot:

enter image description here

Or a screen-shot of the opened selected message showing the Named Properties (aka message properties):

enter image description here


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to Jonic Developer Community for programmer and developer-Open, Learning and Share
...