java - JMS 消息选择器不起作用

标签 java jms activemq

我需要根据消息选择器过滤消息,但似乎具有 messageSelector 的消费者没有过滤任何消息。

我写了下面的代码

ActiveMQUtil

import org.apache.activemq.ActiveMQConnectionFactory;

import javax.jms.*;

public class ActiveMQUtil {
   private ConnectionFactory connectionFactory = null;
    private Connection connection =null;
    private Session session =null;
    private MessageProducer producer = null;
    private MessageConsumer consumer = null;
    private Queue destination = null;
    private MessageConsumer consumerWithSelector;

    public static void main(String []arg) throws JMSException {
        ActiveMQUtil activeMQUtil = new ActiveMQUtil();
        activeMQUtil.initialize();

        activeMQUtil.produceMessage(25000);
        activeMQUtil.consumeMessage();

    }

    private void consumeMessage() throws JMSException {
        Message message = consumerWithSelector.receive(100); // this does not select any message
        //Message message = consumer.receive(100); // This properly received the message and I can see the message
        if(null!=message && message.propertyExists("msgID")){
            System.out.println("Consumed message with msgID = " + message.getIntProperty("msgID"));
        }
        System.out.println("Message consumed "+message);
    }

    private void produceMessage(int messageID) throws JMSException {
        Message message = session.createTextMessage();
        message.setIntProperty("msgID",messageID);
        producer.send(message);
        System.out.println("Produced Message with msgID " + message.getIntProperty("msgID"));
    }

    private   void initialize() throws JMSException {
        connectionFactory = new ActiveMQConnectionFactory("vm://localhost");
        connection = connectionFactory.createConnection();
        connection.start();
        session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
        destination= session.createQueue("TEST.FOO3");
        producer = session.createProducer(destination);
        producer.setDeliveryMode(DeliveryMode.PERSISTENT);
         consumer = session.createConsumer(destination);
        consumerWithSelector = session.createConsumer(destination,"msgID > 900");
    }
}

当我尝试使用 Message message = ConsumerWithSelector.receive(100); 它不会消耗任何消息并打印以下输出

Produced Message with msgID 25000
Message consumed null

但是,使用 Message message = Consumer.receive(100); 可以正确使用消息,我们得到以下输出。

Produced Message with msgID 25000
Consumed message with msgID = 25000
Message consumed ActiveMQTextMessage {commandId = 7, responseRequired = true, messageId = ID:didnsriina6-54782-1433918830039-3:1:1:1:1, originalDestination = null, originalTransactionId = null, producerId = ID:didnsriina6-54782-1433918830039-3:1:1:1, destination = queue://TEST.FOO3, transactionId = null, expiration = 0, timestamp = 1433918830394, arrival = 0, brokerInTime = 1433918830394, brokerOutTime = 1433918844118, correlationId = null, replyTo = null, persistent = true, type = null, priority = 4, groupID = null, groupSequence = 0, targetConsumerId = null, compressed = false, userID = null, content = null, marshalledProperties = org.apache.activemq.util.ByteSequence@2330633a, dataStructure = null, redeliveryCounter = 0, size = 1040, properties = {msgID=25000}, readOnlyProperties = true, readOnlyBody = true, droppable = false, text = null}

请告诉我messageSelector是否存在问题

最佳答案

我已经发现这个问题了。

这里我创建了两个消费者:consumer = session.createConsumer(destination);consumerWithSelector = session.createConsumer(destination,"msgID > 900");

消费者consumer能够选择所有类型的消息,因为它在内部调用带有null选择器的方法作为session.createConsumer(destination,(String)null) ;

因此,该消息可供第一个消费者使用,而我的consumerWithSelector无法看到该消息。

解决这个问题

  • 我评论了 consumer = session.createConsumer(destination);

现在我可以看到过滤后的消息了。

关于java - JMS 消息选择器不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30749457/

相关文章:

java - Java Applet 中的面板不显示

java - 如何在 Java Android 中为客户端请求设置 HttpPost header

java - 使用 lambda java 查找最大值

java - fatal error : 'com.ibm.xtq.commons.utils.wrappedruntimeexception : the root element is required ina well formed document'

activemq - 当 ActiveMQ 中一个队列有多个消费者时,他们是否都传递了到达队列时相同的消息?

java - 如何暂停和恢复 JMS 消息的异步消费

java - java实现循环链​​表

java - 将 Log4J JMSAppender 与 ActiveMQ 结合使用

tomcat - 使用 JMS Tibco EMS JNDI 资源启动 Tomcat 时来自 Catalina 的 NullPointerException

java - 确认来自 JMS 中不同 channel / session 的消息