尝试使用 Java (JMS) 中的选择器在 Tibco EMS 上使用持久消息时遇到问题

Trouble trying to consume persistent messages on Tibco EMS with selectors in Java (JMS)

所以我正在尝试通过 JMS 使用消息 ID selector 使用来自 Tibco EMS 代理的消息。如果消息是 NON_PERSISTENT,我可以通过它们的 JMSMessageID 来 select,一切正常。

如果消息是持久的,selector 不会检索任何内容。我已经在 Apache ActiveMQ 上尝试了相同的代码,它在两种情况下都有效。我看过 EMS 样品,看不到任何明显的东西。想知道是否有一些 EMS 设置可能会影响此...

如果我省略 selector,那么无论 DeliveryMode 是什么,消息都会被正确使用。

这是我用来重现它的内容。

任何帮助将不胜感激:)

package com;

import javax.jms.*;
import com.tibco.tibjms.TibjmsConnectionFactory;

public class JMSTest {
    String msgIdPersistent = "";
    String msgIdNon_Persistent = "";
    String serverUrl = "tcp://localhost:7222";
    String queueName = "test";

    public static void main(String[] args) {
        JMSTest test = new JMSTest();
        try {
            test.publish();
            test.deleteBySelector();
        }catch(Exception ex) {
            ex.printStackTrace();
        }
    }

    public void deleteBySelector() throws Exception {
        // Create connection and session
        ConnectionFactory factory = new TibjmsConnectionFactory(serverUrl);
        Connection connection = factory.createConnection();
        connection.start();
        Session session = connection.createSession();

        // Delete non-persistent
        //
        String selectorNonPersist  = "JMSMessageID='" + msgIdNon_Persistent + "'";
        MessageConsumer nonPersistReceiver = session.createConsumer(session.createQueue(queueName), selectorNonPersist);
        Message nonPersistMsg = null;
        nonPersistMsg = nonPersistReceiver.receive(1000);
        System.out.println("NON PERSISTENT SELECTOR:  " + ((nonPersistMsg!=null) ? "SUCCESS" : "FAIL"));

        // Delete Persistent - **** THIS DOESN'T WORK *****
        //
        String selectorPersist  = "JMSMessageID='" + msgIdPersistent + "'";
        MessageConsumer persistReceiver = session.createConsumer(session.createQueue(queueName), selectorPersist);
        Message persistMsg = null;
        persistMsg = persistReceiver.receive(1000);
        System.out.println("PERSISTENT SELECTOR:  " + ((persistMsg!=null) ? "SUCCESS" : "FAIL"));   
    }

    public void publish() throws Exception {
        ConnectionFactory factory = new com.tibco.tibjms.TibjmsConnectionFactory(serverUrl);
        Connection connection = factory.createConnection();
        connection.start();
        Session session = connection.createSession(javax.jms.Session.AUTO_ACKNOWLEDGE);
        Destination destination = session.createQueue("test");

        // Send persistent message
        //
        System.out.println("Persistent publish");
        MessageProducer producerPersistent = session.createProducer(null);
        producerPersistent.setDeliveryMode(DeliveryMode.PERSISTENT);
        TextMessage messagePersistent = session.createTextMessage("PERSISTENT");
        producerPersistent.send(destination, messagePersistent);
        msgIdPersistent = messagePersistent.getJMSMessageID();
        System.out.println("\tMsgId=" + msgIdPersistent);

        // Send Non Persistent message
        //
        System.out.println("NON Persistent publish");
        MessageProducer producernonPersistent = session.createProducer(destination);
        producernonPersistent.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
        TextMessage messageNonPersistent = session.createTextMessage("NON_PERSISTENT");
        producernonPersistent.send(messageNonPersistent);
        msgIdNon_Persistent = messageNonPersistent.getJMSMessageID();
        System.out.println("\tMsgId=" + msgIdNon_Persistent);

        // Clean up
        session.close();
        connection.close();

        System.out.println("Done publish\n");
    }
}

我从中得到的输出是:

    Persistent publish
        MsgId=ID:EMS-SERVER.3D856ECE827932:1
    NON Persistent publish
        MsgId=ID:EMS-SERVER.3D856ECE827932:2
    Done publish

    NON PERSISTENT SELECTOR:  SUCCESS
    PERSISTENT SELECTOR:  FAIL

我已经确认它是 8.2.x 中的错误。我升级到 8.3.x 并且工作正常。