Active MQ 5.10.0消息重新传递策略不起作用

时间:2014-06-23 15:45:12

标签: java activemq

我以前从未使用过activeMQ。我正在为我的项目做一些研究,我需要根据监听器逻辑重新发送消息。根据{{​​3}},我是:

  1. 使用Session.CLIENT_ACKNOWLEDGE模式
  2. 根据逻辑,确认消息或执行session.recover以再次收到消息。
  3. 使用我当前的代码,我可以在testQueue上读取一次消息。 但我的重新交付政策仍然有效。我尝试了settign初始延迟,但消息是自动传递的。我想把这个信息重新传递5次。那不会发生。

    我正在使用以下代码创建连接工厂,连接,会话和队列:

        RedeliveryPolicy redeliveryPolicy = new RedeliveryPolicy();
        redeliveryPolicy.setInitialRedeliveryDelay(0);
        redeliveryPolicy.setMaximumRedeliveries(5);
        redeliveryPolicy.setRedeliveryDelay(1000);
        redeliveryPolicy.setQueue("*");
        redeliveryPolicy.setBackOffMultiplier(2);
    
        factory = new ActiveMQConnectionFactory(ActiveMQConnection.DEFAULT_BROKER_URL);     
        factory.setRedeliveryPolicy(redeliveryPolicy);
    
        connection = (ActiveMQConnection) factory.createConnection();       
        // connection.setRedeliveryPolicy(redeliveryPolicy);
    
        connection.start();
        Session session = connection.createSession(false, Session.CLIENT_ACKNOWLEDGE);
    
        String queueName = "testQueue"+(UUID.randomUUID());
        System.out.println("Creating Queue: "+queueName);
        testQueue = session.createQueue(queueName);
    

    我尝试将RedeliveryPolicy设置为ActiveMQConnectionFactory和ActiveMQConnection(对我来说没用。)

    然后我在消费者中做了以下设置Message Listener:

    MessageConsumer consumer = session.createConsumer(testQueue);
    consumer.setMessageListener(new MyMessageListener(id, session));
    

    MyMessageListener:

    public void onMessage(Message message) {
        try {
            if (message instanceof TextMessage) {
                TextMessage textMessage = (TextMessage) message;
                String text = textMessage.getText();
                System.out.println("Consuming["+threadId+"] message: " + text);
    
    
                if(text.contains("RD")){
                    System.out.println("acknowledgeThisMessage");
                    ((com.sun.messaging.jms.Message)message).acknowledgeThisMessage();
                } else{
                    session.recover();
                }
            }
            else{
                System.out.println("Consuming["+threadId+"] Weird Message: " + message);
            }
        } catch (JMSException e) {
            e.printStackTrace();
        }
    }
    

    如果您需要更多信息,请告诉我我可以更新帖子。提前谢谢。

1 个答案:

答案 0 :(得分:0)

如果我在使用者中创建侦听器,我能够使RedeliveryPolicies正常工作。我不确定为什么这个有效并且单独上课并不是。我的消费者现在看起来像:

try {           
        MessageConsumer consumer = session.createConsumer(testQueue);
        consumer.setMessageListener(new MessageListener() {
            public void onMessage(Message message) {
                try {
                    if (message instanceof TextMessage) {
                        TextMessage textMessage = (TextMessage) message;
                        String text = textMessage.getText();
                        System.out.println("Consuming["+threadId+"] message: " + text);

                        if(text.contains("RD")){
                            System.out.println("acknowledgeThisMessage");
                            ((com.sun.messaging.jms.Message)message).acknowledgeThisMessage();
                        } else{
                            System.out.println("recovering the message");
                            session.recover();
                        }
                    }
                    else{
                        System.out.println("Consuming["+threadId+"] Weird Message: " + message);
                    }
                } catch (JMSException e) {
                    e.printStackTrace();
                }
            }
        });
    } catch (JMSException e) {
        e.printStackTrace();
    }

希望这有助于某人。