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