11.7. durable Subscriber


概述

图 11.6 “持久化订阅器模式” 所示,持久化 订阅者 是希望接收特定 第 6.2 节 “publish-Subscribe Channel” 频道发送的所有消息的消费者,包括在消费者与消息传递系统断开连接时发送的信息。这要求消息传递系统存储消息以便稍后重播到断开连接的消费者。还必须有一种机制来表示它希望建立持久订阅。通常,发布订阅频道(或主题)可以同时具有 durable 和 non-durable 订阅者,它的行为如下:

  • 非持久订阅者 criu- iwlCan 有两个状态: connecteddisconnected。虽然非持久性订阅者连接到一个主题,但它会实时接收所有主题的信息。但是,在订阅者断开连接时,非持久化订阅者永远不会收到发送到该主题的消息。
  • durable subscriber criu-wagonCan 有两个状态: connectedinactive。inactive 状态意味着持久订阅者与主题断开连接,但希望收到到达动画的消息。当持久订阅者重新连接到该主题时,它会收到一个重播发送的所有信息。

图 11.6. 持久化订阅器模式

持久化订阅者模式

JMS durable subscriber

JMS 组件实施持久订阅者模式。要在 JMS 端点上设置持久订阅,您必须指定一个 客户端 ID,用于标识此特定连接,以及标识 持久 订阅者的持久订阅名称。例如,以下路由设置对 JMS 主题的持久订阅,消息 是 conn01,客户端 ID 为 conn01,持久订阅名称为 John.Doe

from("jms:topic:news?clientId=conn01&durableSubscriptionName=John.Doe").
    to("cxf:bean:newsprocessor");

您还可以使用 ActiveMQ 端点设置持久订阅:

from("activemq:topic:news?clientId=conn01&durableSubscriptionName=John.Doe").
    to("cxf:bean:newsprocessor");

如果要同时处理传入的消息,您可以使用 SEDA 端点将路由分成多个并行片段,如下所示:

from("jms:topic:news?clientId=conn01&durableSubscriptionName=John.Doe").
    to("seda:fanout");

from("seda:fanout").to("cxf:bean:newsproc01");
from("seda:fanout").to("cxf:bean:newsproc02");
from("seda:fanout").to("cxf:bean:newsproc03");

每个消息仅处理一次,因为 SEDA 组件支持 竞争的用户模式

备用示例

另一种方法是将 第 11.5 节 “Message Dispatcher”第 8.1 节 “基于内容的路由器” 与文件或 JPA 组件组合用于持久订阅者,然后是非持久性的 SEDAhttps://access.redhat.com/documentation/zh-cn/red_hat_fuse/7.12/html-single/apache_camel_component_reference/index#file-component

以下是将持久订阅者创建给 JMS 主题的简单示例

使用 Fluent Builder

 from("direct:start").to("activemq:topic:foo");

 from("activemq:topic:foo?clientId=1&durableSubscriptionName=bar1").to("mock:result1");

 from("activemq:topic:foo?clientId=2&durableSubscriptionName=bar2").to("mock:result2");

使用 Spring XML 扩展

 <route>
     <from uri="direct:start"/>
     <to uri="activemq:topic:foo"/>
 </route>

 <route>
     <from uri="activemq:topic:foo?clientId=1&durableSubscriptionName=bar1"/>
     <to uri="mock:result1"/>
 </route>

 <route>
     <from uri="activemq:topic:foo?clientId=2&durableSubscriptionName=bar2"/>
     <to uri="mock:result2"/>
 </route>

以下是 JMS 持久订阅者的另一个示例,但这一次使用 虚拟主题 (AMQ over durable 订阅推荐)

使用 Fluent Builder

 from("direct:start").to("activemq:topic:VirtualTopic.foo");

 from("activemq:queue:Consumer.1.VirtualTopic.foo").to("mock:result1");

 from("activemq:queue:Consumer.2.VirtualTopic.foo").to("mock:result2");

使用 Spring XML 扩展

 <route>
     <from uri="direct:start"/>
     <to uri="activemq:topic:VirtualTopic.foo"/>
 </route>

 <route>
     <from uri="activemq:queue:Consumer.1.VirtualTopic.foo"/>
     <to uri="mock:result1"/>
 </route>

 <route>
     <from uri="activemq:queue:Consumer.2.VirtualTopic.foo"/>
     <to uri="mock:result2"/>
 </route>
Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.