Java 在Apache CAMEL路由的中间使用JMS保证交付吗?

Java 在Apache CAMEL路由的中间使用JMS保证交付吗?,java,apache-camel,jms,Java,Apache Camel,Jms,根据“Camel支持使用以下组件从EIP模式保证交付:…JMS。” 我试图理解这是否意味着我可以在多组件路由的中间使用JMS来“保证交付”。 例如,我有一些路线如下所示: from("rest://post:someRestRoute") // blah blah .to("jms:queue:someQueue"); from("jms:queue:someQueue") // blah blah .to("spring-ws:someAddress")

根据“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只保证向自身进行传递,这似乎是多余的

比如说,

  • 一条消息被发布到
    somerestrate
  • 消息在
    someQueue
    上排队并持久化
  • 消息将立即退出队列
  • 该消息被发送到位于
    someAddress
    的Web服务
  • 据我所知,就JMS代理而言,消息在成功退出队列的那一刻即被“传递”;无论
    springws:someAddress
    是否引发异常。我想,如果Camel在第2步之后立即崩溃,这可能会有所帮助,但我希望能够保证传递到
    someAddress


    在多组件路由的中间使用JMS有什么好处吗?在本例中,它是否可以用于“保证传递”到

    someAddress

    仅当您的JMS队列被定义为持久化消息时。然后,如果您的路由/应用程序/服务器在拾取消息之前停止,它将在队列中,直到下一次路由启动时处理。 如果您不需要持久性,那么就没有理由使用JMS。 可以将Camel设置为在失败时重试传递到端点


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

    我很难理解消息为什么会在队列中停留超过几毫秒。应用程序已经在处理该消息,为什么要将其放在队列中以立即将其再次删除?h-m-m-m。。。比如说,您需要保证交付,在某些情况下,消息被放置,但没有被拾取,因为许多请求到来,JVM运行fullGC或崩溃,服务器重新启动,电源关闭等。然后您需要持久性另一个更重要的情况是集群环境。如果它是direct:directvm:seda:它在一个JVM或上下文中运行的端点类型)。中间有JMS允许在任意数量的其他服务器中处理消息。欢迎您随时使用。一般来说,JMS的主要特点是:1。将发布与处理分离。2.将同一消息传递给多个使用者(如果是主题或使用者在队列上使用筛选器)3。保证交货。如果这些都不是问题,并且可以在一个JVM/CamelConext中直接处理,那么就没有理由让JMS介于两者之间。性能将更好,所需资源更少,如IBM MQ、ActiveMQ等。。。