java - MQDestination 覆盖记帐 token 值

标签 java jms mule ibm-mq mq

我正在尝试在我的系统从入站队列收到的消息上设置记帐 token 。我使用以下内容设置此 token 。

msg.setObjectProperty(JmsConstants.JMS_IBM_MQMD_ACCOUNTINGTOKEN,value)

此外,我的 JmsSUpport 类中有以下属性

((JmsDestination) dest).setBooleanProperty(WMQConstants.WMQ_MQMD_READ_ENABLED, true);
((JmsDestination) dest).setBooleanProperty(WMQConstants.WMQ_MQMD_WRITE_ENABLED, true);    
((MQDestination) dest).setMQMDWriteEnabled(true);
((MQDestination) dest).setMQMDReadEnabled(true);
((MQDestination) dest).setTargetClient(JMSC.MQJMS_CLIENT_NONJMS_MQ);    

由于出站队列是 MQDestination,我必须设置上述属性。现在我发现我正确设置了出站消息的值。但是,当其他应用程序从 MQ 读取消息时,它具有记帐 token 的默认值。这是否是因为 MQ 以这种方式配置来覆盖该值?或者是因为其他应用程序没有正确读取 MQ 消息?或者我应该使用任何其他属性来启用记帐 token ?

是不是因为我正在设置 ((MQDestination) dest).setTargetClient(JMSC.MQJMS_CLIENT_NONJMS_MQ);消息中的 MQMD header 被删除?

最佳答案

不,MQMD 永远不会被剥离。在发送消息之前,您必须在目标上设置身份上下文。否则队列管理器将忽略记帐 token 。请参阅示例代码:

import javax.jms.Connection;
import javax.jms.Destination;
import javax.jms.Message;
import javax.jms.MessageProducer;
import javax.jms.Session;

import com.ibm.msg.client.jms.JmsConnectionFactory;
import com.ibm.msg.client.jms.JmsFactoryFactory;
import com.ibm.msg.client.jms.JmsDestination;
import com.ibm.msg.client.wmq.WMQConstants;
import com.ibm.msg.client.jms.JmsConstants;
import com.ibm.mq.jms.MQDestination;

public class AccountingTokenDemo {

    public static void main(String[]args) {
        // TODO Auto-generated method stub
        AccountingTokenDemo demo = new AccountingTokenDemo();
        demo.putMessageWithAccountingToken();
    }
       public void putMessageWithAccountingToken() {
            JmsConnectionFactory cf = null;
            Connection connection = null;
            Session session = null;
            Destination reqQ = null;
            MessageProducer producer = null;

            try {               
              // Create a connection factory
              JmsFactoryFactory ff = JmsFactoryFactory.getInstance(WMQConstants.WMQ_PROVIDER);
              cf = ff.createConnectionFactory();

              // Set the properties
              cf.setIntProperty(WMQConstants.WMQ_CONNECTION_MODE, WMQConstants.WMQ_CM_BINDINGS);
              cf.setStringProperty(WMQConstants.WMQ_QUEUE_MANAGER, "QM2");

              // Create JMS objects
              connection = cf.createConnection();
              session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);

              // Create a 32 byte accounting toke
              byte [] accountingToken = new byte[32];
              byte b = 'a';
              for(int i=0; i < 32;i++)
                accountingToken[i] = b++;

              // Create destination to send requests
              reqQ = session.createQueue("queue:///REQUESTQ");
              ((MQDestination) reqQ).setTargetClient(WMQConstants.WMQ_CLIENT_NONJMS_MQ);              
              ((JmsDestination) reqQ).setBooleanProperty(WMQConstants.WMQ_MQMD_READ_ENABLED, true);
              ((JmsDestination) reqQ).setBooleanProperty(WMQConstants.WMQ_MQMD_WRITE_ENABLED, true);    
              ((MQDestination) reqQ).setMQMDMessageContext(WMQConstants.WMQ_MDCTX_SET_IDENTITY_CONTEXT);

              // Create producer
              producer = session.createProducer(reqQ);

              // Create a request message
              Message requestMessage = session.createTextMessage("Setting Accounting token on message");
              requestMessage.setObjectProperty(JmsConstants.JMS_IBM_MQMD_ACCOUNTINGTOKEN, accountingToken);
              // Send it off
              producer.send(requestMessage);

            }catch(Exception ex){
                System.out.println(ex);
            }
       }       
}

关于java - MQDestination 覆盖记帐 token 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24259058/

相关文章:

java - ListView 仅显示 ListView 第一个位置的最后一项

java - 将由空格分隔的文件中的值放入多维数组

jms - 有没有办法更改 Nifi 中 PublishJMS 处理器的交付模式?

java - 从线程中的任意位置访问 Mule 消息

java - Java中的密文窃取

Java 堆大小未完全使用

java - Apache Camel : Is it possible to configure WMQ without using Spring?

java - JMS 如何与服务总线相关

骡子 foreach : Splitter returned no results

routes - Mule 子流程与处理器链