【问题标题】:How to implement Logical ordering in IBM MQ in Java?如何在 Java 中的 IBM MQ 中实现逻辑排序?
【发布时间】:2018-02-24 20:16:21
【问题描述】:

我们有一个用例,即放置一组具有相同 groupId 但 MessageSequenceNumber 不同的消息。这用于对消息进行分组以进行逻辑排序,以便在接收方,接收方可以根据组顺序对所有消息进行分组。我关注的是 IBM MQ v7.5 知识中心页面“Message groups”。

我编写了一个代码来放置消息:-

public boolean writeMessage(String[] messages, String queueName) {          

                Session session = getQueueConnection().createSession(true,
                    Session.AUTO_ACKNOWLEDGE);


            Destination destination = session.createQueue(queueName);
            messageProducer = session.createProducer(destination);
            for (int i = 0; i < messages.length; i++) {
                TextMessage message = session.createTextMessage(messages[i]);
                messageProducer.send(message);
            }

            // Commit the send (Actually put messages to Queue)
            session.commit();
            return true;
}

现在,我想为数组内的所有消息添加一个唯一的 groupID 并添加一个序列号(msgSeqNum) (1,2,3..) 。我怎样才能通过 JMS API 做到这一点?我正在 IBM IIB v8 知识中心页面“Sending messages in a WebSphere MQ message group”上寻找代码的 JMS 版本。

【问题讨论】:

  • 你有什么问题?
  • 我已经编辑了这个问题。你现在明白了吗?
  • 你见过这个:stackoverflow.com/questions/7915500/… 吗?我认为这意味着您正在寻求利用依赖于 JMS 的 WebSphere MQ 实现的“专有功能”,而不是标准 JMS。如果您正在使用 JMS 的 WebSphere MQ 实现,那么您应该能够做您想做的事情。如果没有,您可能必须为您需要的功能推出自己的解决方案。
  • @geneSummons 您指的是基于 groupId 过滤的吸气剂程序。我指的是推杆程序来实现它。

标签: java jms ibm-mq


【解决方案1】:

David Currie 在 2006 年写了一篇很好的 IBM developerWorks 博客,标题为“使用 WebSphere MQ Java 和 JMS API 对消息进行分组”,描述了如何按照您的要求进行操作,但它似乎最近被 IBM 删除了。


Wayback Machine link to "Grouping messages using the WebSphere MQ Java and JMS APIs"


以下是 David 在帖子中提供的信息,与 get 逻辑相比,put 逻辑实现起来要简单得多。我只在此处包含放置逻辑代码,因为这是您询问的内容。我通过电子邮件联系了 David,询问是否会重新发布此博客。

发送消息组

让我们从查看发送应用程序开始。正如刚才提到的, put 消息选项 MQPMO_LOGICAL_ORDER 只是一个指令 到队列管理器自动分配消息组 标识符和序列号。下面清单 3 中的示例 演示了如何在 JMS API 中没有此选项的情况下,我们可以 明确设置这些属性。

清单 3. 使用 WebSphere MQ JMS API 发送消息组

MQConnectionFactory factory = new MQConnectionFactory();
factory.setQueueManager("QM_host")
MQQueue destination = new MQQueue("default");
destination.setTargetClient(JMSC.MQJMS_CLIENT_NONJMS_MQ);
Connection connection = factory.createConnection();
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
MessageProducer producer = session.createProducer(destination);
 
String groupId = "ID:" + new BigInteger(24 * 8, new Random()).toString(16);
 
for (int i = 1; i <= 5; i++) {
 
    TextMessage message = session.createTextMessage();
    message.setStringProperty("JMSXGroupID", groupId);
    message.setIntProperty("JMSXGroupSeq", i);
 
    if (i == 5) {
        message.setBooleanProperty("JMS_IBM_Last_Msg_In_Group", true);
    }
 
    message.setText("Message " + i);
    producer.send(message);
 
}
 
connection.close();

【讨论】:

  • 谢谢。这就是我一直在寻找的。如果 David 回复了他博客的新链接,请告诉我。
  • 很高兴它有帮助。请注意,如果您在 Google 上搜索博客标题,您可能还可以获得完整的缓存副本并将其保存下来。如果我获得有关新位置的信息,我会更新此信息。
  • 不确定这个问题背后的原因。有时在我们的代码中,此代码( String groupId = "ID:" + new BigInteger(24 * 8, new Random()).toString(16); )生成 47 个字符而不是 48 个字符。因此,它因以下错误而中断:- com.ibm.msg.client.jms.DetailedJMSException: JMSCMQ1044: String is not a valid hexadecimal number - 'e3c06a7f3c833d68385d43f6f0f0dcd7c8ec8152a2606ab'。
  • @Neer1009 我不知道为什么会这样,最左边的十六进制数字是否可能应该是“0e”并且正在使用的方法是输出这个并填充 0?我不是 Java 开发人员,但是如果少于 48 个字符,您能否将其包装成用 0 填充的东西?
  • 您还可以寻找其他方法来生成唯一的 48 个字符的十六进制字符串。我在 Stackexchange 上进行了搜索,并从 @javaPlease42 中找到了问题“java- how to generate a random hexadecimal value within specified range of values”有希望的答案。
猜你喜欢
  • 2016-03-24
  • 1970-01-01
  • 2021-01-14
  • 2011-11-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-28
  • 1970-01-01
相关资源
最近更新 更多