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 队列在消费客户端关闭后被删除 的相关文章

  • 如何让 BlazeDS 忽略属性?

    我有一个 java 类 它有一个带有 getter 和 setter 的字段 以及第二对 getter 和 setter 它们以另一种方式访问 该字段 public class NullAbleId private static final
  • 动态选择端口号?

    在 Java 中 我需要获取端口号以在同一程序的多个实例之间进行通信 现在 我可以简单地选择一些固定的数字并使用它 但我想知道是否有一种方法可以动态选择端口号 这样我就不必打扰我的用户设置端口号 这是我的一个想法 其工作原理如下 有一个固定
  • jQuery AJAX 调用 Java 方法

    使用 jQuery AJAX 我们可以调用特定的 JAVA 方法 例如从 Action 类 该 Java 方法返回的数据将用于填充一些 HTML 代码 请告诉我是否可以使用 jQuery 轻松完成此操作 就像在 DWR 中一样 此外 对于
  • 在接口中使用默认方法是否违反接口隔离原则?

    我正在学习 SOLID 原则 ISP 指出 客户端不应被迫依赖于他们所使用的接口 不使用 在接口中使用默认方法是否违反了这个原则 我见过类似的问题 但我在这里发布了一个示例 以便更清楚地了解我的示例是否违反了 ISP 假设我有这个例子 pu
  • 来自 dll 的 Java 调用函数

    我有这个 python 脚本导入zkemkeeperdll 并连接到考勤设备 ZKTeco 这是我正在使用的脚本 from win32com client import Dispatch zk Dispatch zkemkeeper ZKE
  • java.lang.IllegalStateException:应用程序 PagerAdapter 更改了适配器的内容,而没有调用 PagerAdapter#notifyDataSetChanged android

    我正在尝试使用静态类将值传递给视图 而不是使用意图 因为我必须传递大量数据 有时我会收到此错误 但无法找出主要原因是什么 Error java lang IllegalStateException The application s Pag
  • 从最终实体获取根证书和中间证书

    作为密码学的菜鸟 我每天都会偶然发现一些简单的事情 今天只是那些日子之一 我想用 bouncy castle 库验证 java 中的 smime 消息 我想我几乎已经弄清楚了 但此时的问题是 PKIXparameters 对象的构建 假设我
  • 如何在用户输入数据后重新运行java代码

    嘿 我有一个基本的java 应用程序 显示人们是成年人还是青少年等 我从java开始 在用户输入年龄和字符串后我找不到如何制作它它们被归类为 我希望它重新运行整个过程 以便其他人可以尝试 的节目 我一直在考虑做一个循环 但这对我来说没有用
  • tomcat 中受密码保护的应用程序

    我正在使用 JSP Servlet 开发一个Web应用程序 并且我使用了Tomcat 7 0 33 as a web container 所以我的要求是tomcat中的每个应用程序都会password像受保护的manager applica
  • 如何对不同的参数类型使用相同的java方法?

    我的问题 我有 2 个已定义的记录 创建对象请求 更新对象请求 必须通过实用方法进行验证 由于这两个对象具有相同的字段 因此可以对这两种类型应用相同的验证方法 现在我只是使用两种方法进行重载 但它很冗长 public record Crea
  • 如何在谷歌地图android上显示多个标记

    我想在谷歌地图android上显示带有多个标记的位置 问题是当我运行我的应用程序时 它只显示一个位置 标记 这是我的代码 public class koordinatTask extends AsyncTask
  • 在我的 Spring Boot 示例中无法打开版本 3 中的 Swagger UI

    我在 Spring Boot 示例中打开 swagger ui 时遇到问题 当我访问 localhost 8080 swagger ui 或 localhost 8080 root api name swagger ui 时出现这种错误 S
  • 尝试将 Web 服务部署到 TomEE 时出现“找不到...的 appInfo”

    我有一个非常简单的项目 用于培训目的 它是一个 RESTful Web 服务 我使用 js css 和 html 创建了一个客户端 我正在尝试将该服务部署到 TomEE 这是我尝试部署时遇到的错误 我在这里做错了什么 刚刚遇到这个问题 我曾
  • 为什么 Java 8 不允许非公共默认方法?

    让我们举个例子 public interface Testerface default public String example return Hello public class Tester implements Testerface
  • 不接受任何内容也不返回任何内容的函数接口[重复]

    这个问题在这里已经有答案了 JDK中是否有一个标准的函数式接口 不接受也不返回任何内容 我找不到一个 像下面这样 FunctionalInterface interface Action void execute 可运行怎么样 Functi
  • Cucumber 0.4.3 (cuke4duke) 与 java + maven gem 问题

    我最近开始为 Cucumber 安装一个示例项目 并尝试使用 maven java 运行它 我遵循了这个指南 http www goodercode com wp using cucumber tests with maven and ja
  • 如何使用mockito模拟构建器

    我有一个建造者 class Builder private String name private String address public Builder setName String name this name name retur
  • 如何将双精度/浮点四舍五入为二进制精度?

    我正在编写对浮点数执行计算的代码的测试 不出所料 结果很少是准确的 我想在计算结果和预期结果之间设置一个容差 我已经证实 在实践中 使用双精度 在对最后两位有效小数进行四舍五入后 结果始终是正确的 但是usually四舍五入最后一位小数后
  • 使用 svn 1.8.x、subclise 1.10 的 m2e-subclipse 连接器在哪里?

    我读到 m2e 的生产商已经停止生产 svn 1 7 以外的任何版本的 m2e 连接器 Tigris 显然已经填补了维护 m2e subclipse 连接器的空缺 Q1 我的问题是 使用 svn 1 8 x 的 eclipse 更新 url
  • Java中super关键字的范围和使用

    为什么无法使用 super 关键字访问父类变量 使用以下代码 输出为 feline cougar c c class Feline public String type f public Feline System out print fe

随机推荐