【问题标题】:Spring JMS - IBM MQ MessagePutOptionsSpring JMS - IBM MQ MessagePutOptions
【发布时间】: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


【解决方案1】:

JMS API 并未公开底层 MQI 中的所有函数。要使上下文设置起作用,必须首先使用适当的 MQOO 值打开队列,就像在第一个片段中一样。并且 MQPUT 使用 MQPMO 值来指示应该尊重 MQMD 字段。

但是这些标志不是由 JMS 层设置的,因此无论 MQMD 值如何,都无法设置上下文。

【讨论】:

猜你喜欢
  • 2011-11-28
  • 2019-11-03
  • 1970-01-01
  • 1970-01-01
  • 2017-01-17
  • 1970-01-01
  • 1970-01-01
  • 2018-04-06
  • 1970-01-01
相关资源
最近更新 更多