com.ibm.msg.client.jms.DetailedIllegalStateException: JMSWMQ2007
Problem: I was trying to set expiration time for my MQ messages using Spring JMS Template.
jmsTemplate.setExplicitQosEnabled(true);
jmsTemplate.setTimeToLive(expiryTime);
jmsTemplate.setTimeToLive(expiryTime);
And for expiration report, trying to set Textmessage properties.
textMessage.setIntProperty(JmsConstants.JMS_IBM_REPORT_EXPIRATION, MQC.MQRO_EXPIRATION_WITH_DATA);
textMessage.setIntProperty(JmsConstants.JMS_IBM_REPORT_PASS_MSG_ID, MQC.MQRO_PASS_MSG_ID);
textMessage.setIntProperty(JmsConstants.JMS_IBM_REPORT_PASS_MSG_ID, MQC.MQRO_PASS_MSG_ID);
When I am trying to execute program, getting below MQ exception.
com.ibm.msg.client.jms.DetailedIllegalStateException: JMSWMQ2007,Failed to send a message to destination . JMS attempted to perform an MQPUT or MQPUT1; however WebSphere MQ reported an error. Use the linked exception to determine the cause of this error.
Solution: When we set property for expiration report, need to also set ReplyToQueue and ReplyToQueueManager. If any message got expired than Expiration report will be sent back to mentioned ReplyToQueueManager and ReplyToQueue by MQ Queue Manager.
private void setJMSProperty(TextMessage textMessage, String ReplyToQueueMgr, String ReplyToQueue) throws JMSException {
MQQueue replyToQ = new MQQueue(ReplyToQueueMgr, ReplyToQueue);
Destination replyTo = (Destination) replyToQ;
textMessage.setJMSReplyTo(replyTo);
textMessage.setIntProperty(JmsConstants.JMS_IBM_REPORT_EXPIRATION, MQC.MQRO_EXPIRATION_WITH_DATA);
textMessage.setIntProperty(JmsConstants.JMS_IBM_REPORT_PASS_MSG_ID, MQC.MQRO_PASS_MSG_ID);
}
MQQueue replyToQ = new MQQueue(ReplyToQueueMgr, ReplyToQueue);
Destination replyTo = (Destination) replyToQ;
textMessage.setJMSReplyTo(replyTo);
textMessage.setIntProperty(JmsConstants.JMS_IBM_REPORT_EXPIRATION, MQC.MQRO_EXPIRATION_WITH_DATA);
textMessage.setIntProperty(JmsConstants.JMS_IBM_REPORT_PASS_MSG_ID, MQC.MQRO_PASS_MSG_ID);
}
How to set MQ instance for installation
If your machine installed with number of MQ instance, than by using below command we can set instance.
Go to bin folder of MQ installation path in command prompt, in my system it is
C:\Program Files (x86)\IBM\WebSphere MQ\bin
Execute the command "setmqinst -n Installation(n) -i" where n is 1,2,3.... I wanted to set in my machine as installation1 so command will be.
C:\Program Files (x86)\IBM\WebSphere MQ\bin\setmqinst -n Installation1 -i
Important summary:
1. How to set IBM MQ expiration time
jmsTemplate.setExplicitQosEnabled(true);
jmsTemplate.setTimeToLive(expiryTime);
2. How to set IBM MQ expiration report
textMessage.setIntProperty(JmsConstants.JMS_IBM_REPORT_EXPIRATION, MQC.MQRO_EXPIRATION_WITH_DATA);
textMessage.setIntProperty(JmsConstants.JMS_IBM_REPORT_PASS_MSG_ID, MQC.MQRO_PASS_MSG_ID);
textMessage.setIntProperty(JmsConstants.JMS_IBM_REPORT_PASS_MSG_ID, MQC.MQRO_PASS_MSG_ID);
3. How to set IBM MQ ReplyToQueue and ReplyToQueueManager
private void setJMSProperty(TextMessage textMessage, String ReplyToQueueMgr, String ReplyToQueue) throws JMSException {
MQQueue replyToQ = new MQQueue(ReplyToQueueMgr, ReplyToQueue);
Destination replyTo = (Destination) replyToQ;
textMessage.setJMSReplyTo(replyTo);
textMessage.setIntProperty(JmsConstants.JMS_IBM_REPORT_EXPIRATION, MQC.MQRO_EXPIRATION_WITH_DATA);
textMessage.setIntProperty(JmsConstants.JMS_IBM_REPORT_PASS_MSG_ID, MQC.MQRO_PASS_MSG_ID);
}
MQQueue replyToQ = new MQQueue(ReplyToQueueMgr, ReplyToQueue);
Destination replyTo = (Destination) replyToQ;
textMessage.setJMSReplyTo(replyTo);
textMessage.setIntProperty(JmsConstants.JMS_IBM_REPORT_EXPIRATION, MQC.MQRO_EXPIRATION_WITH_DATA);
textMessage.setIntProperty(JmsConstants.JMS_IBM_REPORT_PASS_MSG_ID, MQC.MQRO_PASS_MSG_ID);
}