【问题标题】:topic subscriber behaviour during multiple messages on a topic for long running process主题订阅者行为在关于一个主题的多个消息期间用于长时间运行的进程
【发布时间】:2016-01-03 08:08:46
【问题描述】:

我有一个 Spring DMLC 形式的主题和相应的订阅者。我的问题与以下情况有关:

消息在主题上发布,订阅者开始处理消息。如果在处理前一条消息时另一条消息到达该主题,新消息是否会在订阅者忙时丢失,或者在处理前一条消息之后处理该消息。

如果答案是第二条消息将在第一条消息之后处理,那么接下来的问题是这个行为是由代理处理还是由订阅者处理。

【问题讨论】:

    标签: jms spring-jms jms-topic


    【解决方案1】:

    第二条消息会在第一条消息之后处理吗?

    是的

    这种行为是由代理处理还是订阅者必须处理 这个?

    消息的副本将由 Broker 保存,即由 Broker 处理。

    还需要注意的是,有两种类型的 JMS 主题订阅者:

    (1) 非持久订阅者: 仅当订阅者处于活动状态时,代理才会保留副本(在内存中)。

    (2) 持久订阅者: 即使订阅者未处于活动状态,代理也会保留副本(在内存 + 文件系统中)。

    请查找以下 oracle 文档:

    为确保发布/订阅应用程序接收所有发布的消息, 为发布者使用持久交付模式。此外,使用 订阅者的持久订阅。

    Session.createConsumer 方法创建一个非持久订阅者,如果 主题被指定为目的地。非持久订户可以 只接收在它处于活动状态时发布的消息。

    https://docs.oracle.com/cd/E19798-01/821-1841/bncgd/index.html

    【讨论】:

      【解决方案2】:

      除非客户端取消订阅(或死亡),否则下一条消息不会丢失 - 您可以使订阅持久化,这意味着即使在这种情况下消息也不会丢失。

      这(消息处理)由代理控制,而不是客户端;订阅是否持久取决于客户。

      一些代理提供预取功能,在这种情况下,消息可能会在客户端仍在处理当前消息时被发送到客户端,但如果客户端死亡,它仍然不会丢失,因为只有在消息被删除后才会删除它承认。

      【讨论】:

        猜你喜欢
        • 2021-09-28
        • 1970-01-01
        • 2013-03-03
        • 1970-01-01
        • 1970-01-01
        • 2019-09-09
        • 2021-10-30
        • 2016-11-01
        • 1970-01-01
        相关资源
        最近更新 更多