消费客户端关闭后,ActiveMQ Artemis 队列被删除

问题描述

我是 JMS 和 ActiveMQ Artemis 的新手,我遇到了以下问题。我通常将来自应用程序生产者的消息放入 requests 队列:

put message

从其他应用程序消费者那里之后,我尝试使用该消息。这样做没有问题。

但是当我关闭应用程序使用者时,request 队列被无故删除

after consume message

我的应用程序使用者是使用 Spring Boot 构建的,如下所示:

@SpringBootApplication
public class ProcessorClaimsApplication {

    public static void main(String[] args) {
        SpringApplication.run(ProcessorClaimsApplication.class,args);
    }

}
@EnableJms
@Configuration
public class ProcessorClaimsConfig {
    private static final Logger LOGGER = LoggerFactory.getLogger(ProcessorClaimsConfig.class);
    private static final String ORDER_ID = "orderId";
    private static final String APPROVED = "approved";
    private static final String APPROVERS = "approvers";
    private static final String APPOVER_INFO_SEParaTOR = ":";
    private static final String APPROVERS_SEParaTOR = ";";

    @Autowired
    private AS2Service as2Service;

    @Autowired
    private EnsuranceService ensuranceService;

    ...

    @Transactional
    @JmsListener(destination = "requests",selector = "JMSType = 'PAYMENTORDERAPPRovalRESPONSE'")
    public void processZMessageResponse(MapMessage message) {
        try {
            LOGGER.debug("Incoming message found JMSCorrelationID {},orderId {}",message.getJMSCorrelationID(),message.getStringProperty(ORDER_ID));
            boolean approved = (Boolean) message.getobject(APPROVED);
            String approvers = (String) message.getobject(APPROVERS);
            LOGGER.debug("Sending resolution to Ensurance");
            ensuranceService.sendResolution(Long.valueOf(message.getJMSCorrelationID()),message.getStringProperty(ORDER_ID),approved,approvers);
        } catch (Exception e) {
            LOGGER.error("The is an error processing the message: {}" + e.getMessage());
            e.printstacktrace();
        }
    }
}

顺便说一句,原始 requests 队列是在应用程序生产者将消息发送到 ActiveMQ Artemis 时创建的,这是通过 jmstemplate 完成的,如下所示:

public void pushResolution(String jmsCorrelationID,final String paymentOrderId,final String paymentOrderNumber,final String paymentOrderType,Map<String,Object> data) {
        this.jmstemplate.send(requestsQueue,new MessageCreator() {

            @Override
            public Message createMessage(Session session) throws JMSException {
                MapMessage message = session.createMapMessage();
                for (String key : data.keySet()) {
                    message.setobject(key,data.get(key));
                }
                message.setJMSCorrelationID(jmsCorrelationID);
                message.setJMSType(MessageTypeEnum.PAYMENTORDERAPPRovalRESPONSE.name());
                message.setStringProperty("orderId",paymentOrderId);
                message.setStringProperty("orderNumber",paymentOrderNumber);
                message.setStringProperty("orderType",paymentOrderType);
                return message;
            }
            
        });

        LOGGER.debug("Pushed Payment Order Response in Queue successfully.");
    }

如果我关闭应用程序生产者,requests 队列不会被删除。仅当我使用 @JMSListener 关闭应用程序使用者时才会删除队列。

请帮帮我。也许我错过了一些理解或参数?

解决方法

您所观察到的情况是预料之中的,因为这是 ActiveMQ Artemis 的默认行为。地址和队列会自动创建和删除。地址和队列是为了响应客户端发送消息或客户端创建消费者而创建的。一旦队列中没有更多消息并且最后一个消费者断开连接,队列将被删除,因为它不再需要。当没有更多队列绑定到一个地址时,它也会被删除。如有必要,将重新创建这些资源。

您可以使用以下地址设置来控制此行为:

  • auto-create-queues
  • auto-delete-queues
  • auto-create-addresses
  • auto-delete-addresses

您可以使用以下地址设置微调行为:

  • auto-delete-queues-delay
  • auto-delete-queues-message-count
  • auto-delete-addresses-delay

有关详细信息,请参阅 the documentation

,

我想补充原始问题,当消费者重新连接到 artemis 实例时,在消费者关闭时由发送者推送到队列中的任何消息都不会传递给它,我认为这是错误的行为。顺便说一下,artemis classic 好像没有这个问题。