如何在Java中实现IBM MQ中的逻辑排序?

时间:2017-09-15 15:24:36

标签: java jms ibm-mq

我们有一个用例,即使用相同的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;
}

现在,我想为数组内的所有消息添加1个唯一的groupID,并添加序列号(msgSeqNum)(1,2,3 ..)。我如何通过JMS API完成?我正在IBM IIB v8知识中心页面上寻找JMS版本的代码&#34; Sending messages in a WebSphere MQ message group

1 个答案:

答案 0 :(得分:2)

David Currie在2006年撰写了一篇很好的IBM developerWorks博客,名为&#34;使用WebSphere MQ Java和JMS API对消息进行分组&#34;它描述了如何做你要求的事情,但是最近它被IBM删除了。

我可以通过Google的缓存副本查看它。以下是David在帖子中提供的信息,看起来与获取逻辑相比,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();