Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java MQDestination覆盖记帐令牌值_Java_Jms_Mule_Ibm Mq_Mq - Fatal编程技术网

Java MQDestination覆盖记帐令牌值

Java MQDestination覆盖记帐令牌值,java,jms,mule,ibm-mq,mq,Java,Jms,Mule,Ibm Mq,Mq,我试图在系统从入站队列接收的消息上设置记帐令牌。我正在使用以下命令设置此令牌 msg.setObjectProperty(JmsConstants.JMS_IBM_MQMD_ACCOUNTINGTOKEN,value) 在我的JmsSUpport类中还有以下属性 ((JmsDestination) dest).setBooleanProperty(WMQConstants.WMQ_MQMD_READ_ENABLED, true); ((JmsDestination) dest).setBool

我试图在系统从入站队列接收的消息上设置记帐令牌。我正在使用以下命令设置此令牌

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读取消息时,它具有记帐令牌的默认值。这可能是因为MQ的配置方式覆盖了该值吗?还是因为其他应用程序没有正确读取MQ消息?或者我应该使用任何其他属性来启用记帐令牌


是因为我正在设置((MQDestination)dest.setTargetClient(JMSC.MQJMS_CLIENT_NONJMS_MQ);msg会被剥离MQMD头?

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

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);
            }
       }       
}
导入javax.jms.Connection;
导入javax.jms.Destination;
导入javax.jms.Message;
导入javax.jms.MessageProducer;
导入javax.jms.Session;
导入com.ibm.msg.client.jms.JmsConnectionFactory;
导入com.ibm.msg.client.jms.JmsFactoryFactory;
导入com.ibm.msg.client.jms.JmsDestination;
导入com.ibm.msg.client.wmq.WMQConstants;
导入com.ibm.msg.client.jms.JmsConstants;
导入com.ibm.mq.jms.MQDestination;
公共类AccountingTokenDemo{
公共静态void main(字符串[]args){
//TODO自动生成的方法存根
AccountingTokenDemo demo=新AccountingTokenDemo();
demo.putMessageWithAccountingToken();
}
public void putMessageWithAccountingToken(){
JmsConnectionFactory cf=null;
连接=空;
会话=空;
目的地请求q=null;
MessageProducer=null;
试试{
//创建一个连接工厂
JmsFactoryFactory ff=JmsFactoryFactory.getInstance(WMQConstants.WMQ_PROVIDER);
cf=ff.createConnectionFactory();
//设置属性
cf.setIntProperty(WMQConstants.WMQ_连接模式,WMQConstants.WMQ_CM_绑定);
cf.setStringProperty(WMQConstants.WMQ_队列管理器,“QM2”);
//创建JMS对象
connection=cf.createConnection();
会话=connection.createSession(false,session.AUTO_-ACKNOWLEDGE);
//创建一个32字节的记帐托克
字节[]accountingToken=新字节[32];
字节b='a';
对于(int i=0;i<32;i++)
accountingToken[i]=b++;
//创建发送请求的目的地
reqQ=会话。创建队列(“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\u MDCTX\u SET\u IDENTITY\u CONTEXT);
//创建制作人
producer=session.createProducer(reqQ);
//创建请求消息
Message requestMessage=session.createTextMessage(“在消息上设置记帐令牌”);
setObjectProperty(JmsConstants.JMS_IBM_MQMD_ACCOUNTINGTOKEN,ACCOUNTINGTOKEN);
//送走
producer.send(请求消息);
}捕获(例外情况除外){
系统输出打印项次(ex);
}
}       
}

Cna u请帮我解答这个问题,还有一个问题。是否有一种方法可以在不设置((MQDestination)destination.setMQMDMessageContext(WMQConstants.WMQ\u MDCTX\u set\u ALL\u CONTEXT)的情况下设置记帐令牌;你能帮我解决这个问题吗?因为这个问题非常紧急: