【问题标题】:Using Time to live with Camel framework in Java在 Java 中使用 Time 与 Camel 框架一起生活
【发布时间】:2014-10-10 22:43:07
【问题描述】:

我正在使用 Camel 进行集成工作,并使用 HTTP 端点作为代理将某些消息路由到 HTTP 端点。我将路由配置为使用我的自定义错误处理程序,它将失败的消息放置在我指定的队列中(死信通道模式)。

<route>
    ...
    <to uri="direct:MessageTypeGuaranteed"/>
</route>

<route errorHandlerRef="MyCustomErrorHandler">
    <from uri="direct:MessageTypeGuaranteed">
    <to uri="http://dummyUri?throwExceptionOnFailure=true"/>
</route>

当任何东西未能传递到我的 http 端点时,它会被添加到我的自定义队列(“CustomFailedMessageQueue”)中,并且我有一个单独的路由来尝试重试这些消息:

<route>
    <from uri="jms:queue:CustomFailedMessageQueue">
    <to uri="direct:MessageTypeGuaranteed"/>
</route>

我想做的是能够指定我只想让一条消息存活 10 秒。所以我正在尝试设置时间来生活在我的 http 目的地本身。

例如,我有一个处理器可以做这样的事情:

exchange.getIn().setHeader(Exchange.HTTP_URI, "http://localhost/nodeserver?timeToLive=10000");

但是,我认为我误解了文档。 timeToLive 选项仅在将其传递给 jms 组件时才有效,对吗?换句话说,如果我想利用时间来忍受这个端点,我需要在处理器中处理自己,对吗?

【问题讨论】:

  • 只是为了弄清楚,消息在队列中存活 10 秒对吗?
  • 是的,没错。
  • 所以我认为你应该把这个写在你的 jms 上!你能在路由中显示你的 DeadLetterChannel 配置吗?

标签: java apache-camel integration activemq


【解决方案1】:

是的 TimeToLive 是 Camel JMS 组件支持的 JMS 规范中的一个选项。该选项对 HTTP 等其他组件没有任何意义。

似乎您可能想要使用过滤器 EIP 并在消息 时丢弃该消息,并且您可以使用 java 方法等来实现一些代码来确定它是旧的还是旧的不是,并返回一个布尔值

public boolean isNotToOld(Exchange exchange) {
   ...
   return true // to accept and process the message
}

在此处查看有关过滤器 eip 的更多信息

你可以在类似的路线中使用它

  <from uri="direct:MessageTypeGuaranteed">
  <filter>
    <method ref="myBean" method="isNotToOld"/>
    <to uri="http://dummyUri?throwExceptionOnFailure=true"/>
  </filter>

【讨论】:

  • 克劳斯先生,您是一位绅士和一位学者。我非常感谢您参与这个社区。另外,你的书很棒!
猜你喜欢
  • 2012-11-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-04
相关资源
最近更新 更多