Spring JMS - IBM MQ MessagePutOptions。

问题描述 投票:0回答:1

我使用了非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());
        }

    }

我是不是做错了什么

spring jms ibm-mq spring-jms
1个回答
0
投票

JMS API并没有暴露底层MQI中的所有功能。为了让上下文设置工作,必须先用适当的MQOO值打开队列,就像你的第一个片段一样。而MQPUT使用MQPMO值来表示应该尊重MQMD字段。

但是这些标志并不是由JMS层设置的,所以无论MQMD值如何,都不能设置上下文。

© www.soinside.com 2019 - 2024. All rights reserved.