【问题标题】:Does using JMS in the middle of a Apache Camel route guarantee delivery?在 Apache Camel 路由中间使用 JMS 可以保证交付吗?
【发布时间】:2023-03-29 06:08:02
【问题描述】:

根据Apache Camel documentation,“Camel 使用以下组件支持 EIP 模式的保证交付:... JMS。”

我试图了解这是否意味着我可以在多组件路线的中间使用 JMS 来“保证交付”。

例如,我有一些看起来像这样的路线:

from("rest://post:someRestRoute")
    // blah blah
    .to("jms:queue:someQueue");

from("jms:queue:someQueue")
    // blah blah
    .to("spring-ws:someAddress")
    .to("someOtherRoute");

在多组件路由中间使用 JMS 有什么好处吗? Camel 在队列中读写,队列在同一台计算机和同一个 JVM 上运行,所以 Camel 只保证传递给自己,这似乎是多余的。

例如,

  1. 一条消息被发布到someRestRoute
  2. 消息在someQueue 上排队和持久化。
  3. 消息立即出队。
  4. 消息被发送到someAddress 的网络服务。

据我了解,就 JMS 代理而言,消息在成功出列的那一刻就被“传递”了; spring-ws:someAddress 是否抛出异常无关紧要。我想如果 Camel 在第 2 步之后立即崩溃,这可能会有所帮助,但我希望能保证交付给 someAddress

在多组件路由中间使用 JMS 有什么好处吗?例子中可以用来“保证送达”到someAddress吗?

【问题讨论】:

    标签: java apache-camel jms


    【解决方案1】:

    仅当您的 JMS 队列被定义为保留消息时。然后,如果您的路由/应用程序/服务器在选择消息之前停止,它将在队列中,直到下次路由开始时处理。 如果您不需要持久性,那么没有理由拥有 JMS。 Camel 可以设置为在失败的情况下重试传递到端点。

    但是,如果您需要持久性,JMS 是最好的(如果不是唯一的)方法。

    【讨论】:

    • 我无法理解为什么消息会在队列中停留超过几毫秒。应用程序已经在处理消息了,为什么要把它放在一个队列中并立即再次取出呢?
    • hmmm... 假设您需要保证交付,并且在某些情况下放置了消息,但由于许多请求到来,JVM 运行 fullGC 或崩溃,服务器重新启动,电源关闭等而没有被选中。然后你需要坚持
    • 另一个更重要的案例是集群环境。如果它是直接的:direct-vm: seda:它在一个 JVM 或 CamelContext 中运行的端点类型)。中间有 JMS 允许在任意数量的其他服务器中处理消息。
    • 随时欢迎您。一般来说,JMS 的主要功能是: 1. 将发布与处理解耦。 2. 将相同的消息传递给多个消费者(如果它是一个主题或消费者在队列上使用过滤器) 3. 保证传递。如果没有任何情况可以在一个 JVM/CamelConext 中直接处理,那么就没有理由在两者之间使用 JMS。性能会更好,需要的资源更少,比如IBM MQ、ActiveMQ等……
    猜你喜欢
    • 1970-01-01
    • 2014-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-04
    • 1970-01-01
    • 2016-09-29
    • 1970-01-01
    相关资源
    最近更新 更多