[英]Trouble trying to consume persistent messages on Tibco EMS with selectors in Java (JMS)
所以我试图通过带有消息 ID 选择器的 JMS 使用来自 Tibco EMS 代理的消息。 如果消息是 NON_PERSISTENT,我可以通过它们的 JMSMessageID 来选择它们,并且一切正常。
如果消息是持久的,则选择器不会检索任何内容。 我已经在 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
我已经确认它是 8.2.x 中的一个错误。 我升级到 8.3.x 并且运行良好。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.