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

ActiveMQ Artemis queue deleted after shutdown of consuming client

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

在那之后,我尝试使用来自其他应用程序消费者的消息。这没有问题。

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

我的应用程序消费者是使用 Spring 引导构建的,如下所示:

@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好像没有这个问题