Activemq 禁用ActivemMQ消息的DLQ和重新传递

Activemq 禁用ActivemMQ消息的DLQ和重新传递,activemq,Activemq,我正在开发一个在ActiveMQ中推送要处理的消息的系统。我有一个严格的要求,消费者必须按照传入的顺序处理消息。如果消费者中的消息处理失败,它需要回滚/恢复并继续无限次地重试。只有当消息处理成功时,使用者才需要提交并继续处理下一条消息 如何防止回滚邮件自动转发到DLQ,以及为此类要求配置重新传递策略的正确方法是什么?当设置重新传递策略时,如下图所示,重新无限尝试,邮件将永远不会发送到DLQ policy.setMaximumRedeliveries(RedeliveryPolicy.NO_MAX

我正在开发一个在ActiveMQ中推送要处理的消息的系统。我有一个严格的要求,消费者必须按照传入的顺序处理消息。如果消费者中的消息处理失败,它需要回滚/恢复并继续无限次地重试。只有当消息处理成功时,使用者才需要提交并继续处理下一条消息


如何防止回滚邮件自动转发到DLQ,以及为此类要求配置重新传递策略的正确方法是什么?

当设置重新传递策略时,如下图所示,重新无限尝试,邮件将永远不会发送到DLQ

policy.setMaximumRedeliveries(RedeliveryPolicy.NO_MAXIMUM_REDELIVERIES)

使用
ActiveMQSession.INDIVIDUAL_ACKNOWLEDGE
可以逐个确认消息

如果您想手动停止并重新启动消费者,请查看此处

import javax.jms.Connection;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageListener;

import org.apache.activemq.ActiveMQConnectionFactory;
import org.apache.activemq.ActiveMQMessageConsumer;
import org.apache.activemq.ActiveMQSession;
import org.apache.activemq.RedeliveryPolicy;

public class SimpleConsumerIndividualAcknowledge {

    public static void main(String[] args) throws JMSException {
        Connection conn = null;
        try {
            ActiveMQConnectionFactory cf = new ActiveMQConnectionFactory("tcp://localhost:61616");
            RedeliveryPolicy policy = new RedeliveryPolicy();
            policy.setMaximumRedeliveries(RedeliveryPolicy.NO_MAXIMUM_REDELIVERIES);
            cf.setRedeliveryPolicy(policy);
            conn = cf.createConnection();
            ActiveMQSession session = (ActiveMQSession) conn.createSession(false,
                    ActiveMQSession.INDIVIDUAL_ACKNOWLEDGE);
            ActiveMQMessageConsumer consumer = (ActiveMQMessageConsumer) session
                    .createConsumer(session.createQueue("test"));
            consumer.setMessageListener(new MessageListener() {
                @Override
                public void onMessage(Message message) {
                    try {
                        //do your stuff
                        message.acknowledge();
                    } catch (Exception e) {
                        throw new RuntimeException(e);//ActiveMQMessageConsumer.rollback() is called automatically
                    }
                }
            });
            conn.start();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (conn != null) {
                try {
                    conn.close();
                } catch (Exception e) {
                }
            }
        }
    }
}