【发布时间】:2020-09-29 11:09:47
【问题描述】:
我使用非 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());
}
}
我做错了什么
【问题讨论】:
-
我“认为”这应该是
txtMsg.setStringProperty("JMS_IBM_MQMD_ApplIdentityData", "Test")。注意我认为案例在这里很重要。如果可行,我可以写一个快速的答案。 -
我试过但没用
-
你能确认你确实使用了混合大小写吗?
-
@sam:首先,小心:您在 JMS 代码中使用
WMQ_MDCTX_SET_ALL_CONTEXT值(与纯代码相反),这意味着未设置放置日期和朋友。 -
@sam:我在我的机器上尝试了你的代码,它可以工作(Windows,MQ 客户端
com.ibm.mq.allclient-9.1.4.0.jar,MQ 服务器 9.1.4.0)。你在用什么?
标签: spring jms ibm-mq spring-jms