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

2023-12-19

I am newbie on JMS and ActiveMQ Artemis, and I have the following problem. I put a message in a requests queue normally from an application producer: put message

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

But when I shutdown the application consumer the request queue was deleted for no reason. 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

See 文档 http://activemq.apache.org/components/artemis/documentation/latest/address-model.html#configuring-addresses-and-queues-via-address-settings更多细节。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐