【问题标题】:Trouble trying to consume persistent messages on Tibco EMS with selectors in Java (JMS)尝试使用 Java (JMS) 中的选择器在 Tibco EMS 上使用持久消息时遇到问题
【发布时间】:2016-08-13 08:35:11
【问题描述】:

所以我试图通过带有消息 ID 选择器的 JMS 使用来自 Tibco EMS 代理的消息。如果消息是 NON_PERSISTENT,我可以通过它们的 JMSMessageID 选择它们,并且一切正常。

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

如果我省略了选择器,那么无论 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

【问题讨论】:

  • 您使用的是 Tibco EMS 8.x 吗?我看到了同样的行为。它看起来是一个错误。你有没有运气解决这个问题?
  • 是的,使用 EMS 8.2。解决这个问题仍然没有运气。我正在使用相同的核心代码来浏览多个 JMS 代理类型。 EMS 是我看到此问题的唯一经纪人。 8.3出来了,试试看....

标签: java jms tibco-ems


【解决方案1】:

我已经确认它是 8.2.x 中的一个错误。我升级到 8.3.x 并且运行良好。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多