【问题标题】:How to set message Id for IBM MQ using java program如何使用 java 程序为 IBM MQ 设置消息 ID
【发布时间】:2019-03-24 04:02:29
【问题描述】:

我能够为 IBM mq 设置关联 ID,但无法为消息设置消息 ID 我正在设置的消息 ID 被 MQ 覆盖 如何将此消息 ID 设置为低于 1 是我正在尝试的代码 请帮助我在这个任务上。代码中有什么我需要做的吗???

 public static void main(String args[]) 
    {

    try{
       MQQueueConnectionFactory cf = new MQQueueConnectionFactory();
          cf.setHostName("xxx");
          cf.setPort(4444);
          cf.setTransportType(1);
          cf.setQueueManager("xxxx");
          cf.setChannel("CLIENT.xyZ");

          MQQueueConnection connection = (MQQueueConnection) cf.createQueueConnection();
          MQQueueSession session = (MQQueueSession) connection.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);

          MQQueue queue = (MQQueue) session.createQueue("WW.ESB.ENTRY.SERVICE.IN");
          queue.setBooleanProperty(WMQConstants.WMQ_MQMD_WRITE_ENABLED, true);
 queue.setIntProperty(WMQConstants.WMQ_MQMD_MESSAGE_CONTEXT, WMQConstants.WMQ_MDCTX_SET_IDENTITY_CONTEXT);
          MQQueueSender sender =  (MQQueueSender) session.createSender(queue);

          true);




          File f=new File("C:/InputPayloads/Payloads/test4.xml");
          JMSTextMessage message = (JMSTextMessage) session.createTextMessage(FileUtils.readFileToString(f)); 
          message.setStringProperty("JMS_IBM_MQMD_UserIdentifier", "avada2");


          // Hex-string 010203040506070801020304050607080102030405060708
          byte[] customMessageId = new byte[24];
          for (int i = 0; i < 24; i++) {
            customMessageId[i] = (byte) ((i % 8) + 1);
          }

           message.setObjectProperty(WMQConstants.JMS_IBM_MQMD_MSGID, customMessageId);


          message.setStringProperty("xxx", "SH_TEST04");
          message.setStringProperty("yyy", "JP");
          message.setStringProperty("zzz", "1");
          connection.start();

          System.out.println("before Sent message:\\n" + message);

          sender.send(message);
          System.out.println("Sent message:\\n" + message);

          sender.close();
          session.close();
          connection.close();
    }catch(Exception e)
    {
        System.out.println(e);
    }
}

} 我遇到了错误

com.ibm.msg.client.jms.DetailedJMSSecurityException: JMSWMQ2008: Failed to open MQ queue 'WW.zzz.xxx.yyy.zz'.

JMS 尝试执行 MQOPEN,但 IBM MQ 报告了错误。 使用链接异常来确定此错误的原因。检查指定的队列和队列管理器是否定义正确。

由于这条线

【问题讨论】:

  • 在应用程序中设置 MsgId 是个坏主意。让队列管理器为您生成一个唯一的 MsgId。如果您需要设置一个值,请使用 CorrelationId 或简单地设置一个消息属性。
  • @Roager 我对我的经理说了同样的话,但他说这是强制性的,没有说明理由
  • 因此,由于未来的编码错误,您经理的想法可能会在将来引入具有重复 MsgId 的消息。 IBM 表示,如果您让队列管理器生成 MsgId,那么它将生成为唯一的。告诉您的经理他/她的想法违反了 IBM 的 MQ 最佳实践。

标签: java jms ibm-mq


【解决方案1】:

JMS 规范指出消息 ID 必须由 JMS 提供者设置,并且它必须是唯一的或为空,即您不能自己设置。

但是,您可以使用 IBM MQ 特定的扩展来自己设置消息 ID,记住您现在违反了 JMS 规范。

为此,您需要设置JMS_IBM_MQMD_MsgId,然后将其值复制到JMSMessageID(即不能直接设置)。

现在您知道要设置的属性的名称,请参阅this other question 了解更多详细信息以及 IBM MQ JMS 专家 (@Calanais) 的回答中的代码示例。

进一步阅读

【讨论】:

  • 我替换了上面的代码 message.setJMSMessageID("98765432110111213141516123456783"); with byte[] customMessageId = new byte[24]; for (int i = 0; i
  • 如果您运行我指出的答案中引用的示例 SimpleWMQMDWrite.java,这行得通吗?您的代码与该示例有何不同?
  • 我更新它与我在您的参考后运行的代码相同我更新了代码
  • 我不确定这是否回答了我的问题 - 示例对您有用吗?
  • 将您的代码与示例进行比较,我看到您在发送方而不是队列上设置了布尔属性 WMQ_MQMD_WRITE_ENABLED。
猜你喜欢
  • 2021-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多