我使用了非JMS的java代码来发布消息到IBM MQ,并指定各种MQPutMessage选项来设置身份上下文。
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;
}
现在要发送消息
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) {
}
}
当我尝试使用JMS模板并添加所有的MQ put选项时,消息正在被发布,但applicationIdentity上下文没有被发布到队列中。
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发送方法 -
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());
}
}
我是不是做错了什么
JMS API并没有暴露底层MQI中的所有功能。为了让上下文设置工作,必须先用适当的MQOO值打开队列,就像你的第一个片段一样。而MQPUT使用MQPMO值来表示应该尊重MQMD字段。
但是这些标志并不是由JMS层设置的,所以无论MQMD值如何,都不能设置上下文。