MQDestination переопределяет значение маркера учета

Я пытаюсь установить токен учета в сообщении, которое моя система получила из входящей очереди. Я устанавливаю этот токен, используя следующее.

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); сообщение удаляется из заголовков MQMD?


person Pratik Shelar    schedule 17.06.2014    source источник


Ответы (1)


Нет, 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);
            }
       }       
}
person Shashi    schedule 17.06.2014
comment
Cna u, пожалуйста, помогите мне с этим вопросом context" title="Разница между wmq mdctx set all contex и wmq mdctx set identity context">stackoverflow.com/questions/24424781/ - person Pratik Shelar; 26.06.2014
comment
Еще один вопрос. Есть ли способ установить токен учета без установки пункта назначения ((MQDestination)).setMQMDMessageContext(WMQConstants.WMQ_MDCTX_SET_ALL_CONTEXT); - person Pratik Shelar; 26.06.2014
comment
Не могли бы вы помочь мне с этим вопросом, так как он очень срочный: stackoverflow.com/questions/24424781/ - person Pratik Shelar; 27.06.2014