Reputation: 381
I have used non-JMS java code to publish messages to IBM MQ and specifying various MQPutMessage Options to set the Identity Context
public com.ibm.mq.MQQueue publishMQQueue() {
MQQueueManager mqManager = null;
com.ibm.mq.MQQueue mqQueue = null;
try {
MQEnvironment.hostname = pubHost;
MQEnvironment.channel = pubChannel;
MQEnvironment.port = pubPort;
mqManager = new MQQueueManager(pubQmgr);
int openOptions = CMQC.MQOO_OUTPUT | CMQC.MQOO_FAIL_IF_QUIESCING | CMQC.MQOO_SET_IDENTITY_CONTEXT;
mqQueue = mqManager.accessQueue(pubQueue, openOptions);
} catch (MQException e) {
e.printStackTrace();
}
return mqQueue;
}
Now to send a message
public void sendMessage(Message m) {
MQPutMessageOptions pmo = new MQPutMessageOptions();
pmo.options = CMQC.MQPMO_SET_IDENTITY_CONTEXT | CMQC.MQPMO_SYNCPOINT;
try {
MQMessage mqMessage = new MQMessage();
mqMessage.characterSet = 819;
mqMessage.writeString(m.getPayload().toString());
mqMessage.applicationIdData = "Test";
mqMessage.format = "MQSTR";
// ODSLogger.log(Level.FINE,"Sending light event...");
mqQueue.put(mqMessage, pmo);
mqQueue.connectionReference.commit();
} catch (Exception e) {
}
}
When I try to use JMS template and added all the MQ put option, the message is getting published but the applicationIdentity context is not getting published to the queue
public MQQueue publishMQQueue() {
MQQueue mqQueue = null;
try {
mqQueue = new MQQueue(pubQmgr, pubQueue);
mqQueue.setBooleanProperty(WMQConstants.WMQ_MQMD_WRITE_ENABLED, true);
mqQueue.setIntProperty(WMQConstants.WMQ_MQMD_MESSAGE_CONTEXT, WMQConstants.WMQ_MDCTX_SET_ALL_CONTEXT);
mqQueue.setMQMDWriteEnabled(true);
mqQueue.setBooleanProperty(WMQConstants.WMQ_MQMD_READ_ENABLED, true);
} catch (JMSException e) {
logger.error("IngestionConfig::publishMQQueueConnectionFactory():Error in publishMQQueueConnectionFactory "
+ e.getCause());
}
return mqQueue;
}
@Bean(name = "jmsTemplate")
public JmsTemplate getJmsSendTemplate() {
JmsTemplate jmsTemplate = new JmsTemplate();
jmsTemplate.setConnectionFactory((ConnectionFactory) singleMQConnectionQueueFactory());
jmsTemplate.setDefaultDestination((Destination) publishMQQueue());
// jmsTemplate.setPubSubDomain(true);
// jmsTemplate.setSessionAcknowledgeModeName("AUTO_ACKNOWLEDGE");
// logger.debug("Queue for publishing is connected...");
return jmsTemplate;
}
JMS Send method -
public void sendMessage(String message) {
logger.info("MQMessageProcessor::sendMessage(): " + message + " :: " + publishQueue);
try {
jmsTemplate.send(publishQueue, new MessageCreator() {
@Override
public Message createMessage(Session session) throws JMSException {
TextMessage txtMsg = session.createTextMessage(message);
txtMsg.setStringProperty(JmsConstants.JMS_IBM_MQMD_APPLIDENTITYDATA, "Test")
return txtMsg;
}
});
} catch (Exception jmsEx) {
logger.info("MQMessageProcessor::sendMessage()::Exception:" + jmsEx.getMessage());
}
}
Am i doing something wrong
Upvotes: 0
Views: 1693
Reputation: 1027
The JMS API does not expose all of the function in the underlying MQI. For context setting to work, the queue must first be opened with the appropriate MQOO values as you have in your first fragment. And the MQPUT uses MQPMO values to indicate that MQMD fields should be respected.
But those flags are not set by the JMS layer, so context cannot be set regardless of MQMD values.
Upvotes: 0