当前位置: 首页 > 知识库问答 >
问题:

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

郎项禹
2023-03-14

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

我的应用程序使用者是用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.");
    }

共有1个答案

易招
2023-03-14

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

您可以通过以下地址设置来控制此行为:

  • 自动创建队列
  • 自动删除队列
  • 自动创建地址
  • 自动删除地址

您可以通过以下地址设置微调行为:

  • 自动删除-队列-延迟
  • 自动删除-队列-消息-计数
  • 自动删除-地址-延迟

有关更多详细信息,请参见文档。

 类似资料:
  • 问题内容: 我正在使用一些示例代码,该代码使我可以将消息从Python客户端发送到Android服务器(TCP)。但是,仅在关闭客户端后,该消息才会显示在Android仿真器上。 我可能缺少tcp套接字(首​​次使用和实现)背后的一些基本知识。 我的主要目的是使Android App中的按钮可以在单击时将不同的消息发送到单独的Linux系统上的Python客户端,并且Python客户端在收到该消息

  • 我在kafka消费者文档中看到了这个注释-

  • 我的应用程序使用来自RabbitMQ的一些消息并对其进行处理。我有大约10个队列,每个队列最多有10个消费者(线程)。我有5次预回迁。我正在Heroku中使用CloudAMQP插件(RabbitMQ作为服务)运行安装程序。 我使用默认心跳和连接超时设置(60秒)运行。 我的java应用程序是一个使用sping-Rabbit库的Spring Boot应用程序。 版本: 问题是对于一个特定队列的消费者

  • 使用.NET rabbitmq客户端(https://www.rabbitmq.com/dotnet.html)。创建了一个库,其他项目可以引用该库在总线上订阅/取消订阅/发布消息。 根据这里和这里提供的信息,为了让每个订户接收所有消息,每个客户端需要为每个订户定义一个不同的队列,绑定到交换机。我遇到的问题是如何在“客户端”应用程序使用队列完成后删除队列(因为这将以指数级增长,而且永远不会被清理掉

  • 我已经实现了一个简单的应用程序来理解spring cloud是如何为客户端配置的。 它只包含两个类:

  • socket.io 0.9 node.js 0.10.15 速递3.3.4 即:调用 --服务器端 --客户端