【问题标题】:Problem with routing between two beans using apache camel使用apache camel在两个bean之间路由的问题
【发布时间】:2025-12-10 02:00:01
【问题描述】:

下面是我的骆驼路线

 <camelContext id="camel" xmlns="http://camel.apache.org/schema/spring" >
    <route>
      <from uri="bean:SendClass?method=send" />
      <to uri="jms:MyQueue" pattern="InOnly" />
    </route>
    <route>
    <from uri="jms:MyQueue" />
    <to uri="bean:recvClass?method=recv" />
    </route>
  </camelContext>

send 方法在由第 3 方 Pojo 以不规则的时间间隔激活时发送消息。但是,我认为问题是骆驼正在重新启动 一旦recv bean接收到消息并重新发送相同的消息(一秒钟内有数百条消息)的路由。理想情况下,我希望它 当发送方法被激活并创建新消息时发送消息(即 JMS 队列应该有唯一的消息)。我该怎么做?

可能的解决方案是:

  1. 是他们的某些属性,我可以将其放在&lt;from.../&gt; 中来执行此操作吗?
  2. 编写一个处理器来过滤发送 bean 和队列之间的唯一消息。
  3. 是他们在不使用&lt;from uri="bean:..." /&gt; 的情况下进行路由的其他方式吗?

谢谢 sanre6

【问题讨论】:

    标签: apache-camel


    【解决方案1】:

    你不应该有第一条路线。当你这样做时,你告诉 Camel 不断地调用那个 bean 上的 send 方法并路由它。这就是为什么您每秒会看到 100 条消息的原因。

    相反,您应该使用 bean 代码中的一些 Camel API 并将消息发送到 JMS 队列。例如使用 ProducerTemplate。

    【讨论】:

    • 我认为我可以同时使用 Spring XMl 或 Java DSl。所以,如果我使用像 template.sendBody("activemq:MyQueue", "world!");.. 这样的 Producertemplate,那么这意味着我必须使用 Java DSl 对吗?我怎么能用 Spring XML 做到这一点。谢谢你的回答
    • 在 send() 方法的 Java 代码中。这是您将消息发送到 Camel 的地方,因为它会在调用 send() 方法时发生。
    • 有没有一种方法可以直接在camelcontext xml文件中完成,而不使用java代码中的注释?
    • 可以隐藏中间件。在您的其他问题之一中查看我的回答。