【问题标题】:Polling File Consumer In Apache在 Apache 中轮询文件使用者
【发布时间】:2012-03-17 08:42:43
【问题描述】:

我最近开始玩 Apache camel。所以作为实验类型,我想我会创建一个简单的项目,它会每隔几秒钟扫描一个文件目录,看看我是否有一个新文件选择该文件,然后将其复制到另一个文件夹。稍后我想将这些文件放入数据库中。

所以首先保持基础,我创建了如下路线:

 from("file://c:/CTest/inbox?noop=true")
                .to("file://C:/Ctest/outbox");

这很有效,我认为可以让我们添加一个计时器。最初我犯了使用计时器的错误并尝试了这个:

from("timer://myTimer?period=50").to("file://c:/CTest/inbox?noop=true")
                .to("file://C:/Ctest/outbox");

然后我遇到了一些关于无法写入文件的奇怪异常。然后我通过将文件路由放在计时器路由之后实现了它成为生产者。所以我研究了一下,这就是我有点困惑的地方。

所以据我了解,文件组件使用预定的轮询模式。文件路由 url 模式中甚至还有 pollStrategy 选项。还有一个轮询消费者 EIP。

这就是我的困惑所在。

1) 如果文件组件使用计划轮询模式,它是否使用/实现轮询消费者 EIP?

2) 如何向文件组件添加一个简单的计划,以每隔 30 秒消耗一次文件?

3) 如何通过实现 org.apache.camel.PollingConsumerPollStrategy 创建自己的 pollingStrategy?

我怀疑我可以这样做:

    from("file://c:/CTest/inbox?noop=true&pollStrategy=some-expression")
                .to("file://C:/Ctest/outbox");

我试图在这方面举一些例子,但我要么没有找到正确的地方,要么完全错过了情节。我想这与其说是与代码相关的问题,不如说是这种方法的最佳策略/模式。

谢谢 南非类

【问题讨论】:

  • 您能指导一下您是如何使用 from() API 的吗?我不确定需要进行哪些配置以及如何进行?

标签: java architecture apache-camel


【解决方案1】:

Camel 提供了一个名为 routepolicy 的功能 http://camel.apache.org/routepolicy.html

它允许您将策略与路由相关联。我们提供了许多开箱即用的政策。策略可以是任何类型的逻辑。例如,我们提供了一个节流策略,它可以根据线程持有量即时挂起/恢复路由。

另一个开箱即用的政策是计划政策,因此您可以为路线指定“开放时间”。所以你也可以使用它。但请注意它的开放时间,因此您可以指定开始/结束时间。有一个基于石英 cron 的策略 http://camel.apache.org/cronscheduledroutepolicy.html,因此您可以将其配置为在星期一启动路由,并让它运行一段时间。

如果您需要从路线内停止路线,那就有点复杂了,这里有一个关于此的常见问题解答:http://camel.apache.org/how-can-i-stop-a-route-from-a-route.html

【讨论】:

  • 谢谢克劳斯。看来我还有很长的路要走。那么是否可以从计时器或石英组件启动骆驼路线?对,所以我想没有正确的答案,但是你什么时候使用轮询策略,什么时候使用路由策略,什么时候使用延迟?非常感谢您对此的想法和经验。
  • 这取决于您的需求。 pollEnrich 一次只能拾取一个文件,因此如果您的用例是拾取和处理目录中的所有文件,它有其局限性。如果是这样,那么路由策略就更有意义了。
【解决方案2】:

1) 如果文件组件使用预定的轮询模式 使用/实现轮询消费者 EIP?

是的,文件生产者实现了ScheduledPollEndpoint。来自doc

相当多的入站 Camel 端点使用计划的轮询模式来 接收消息并通过 Camel 处理路由推送它们。 也就是说,端点似乎在客户端外部使用 事件驱动的消费者,但在内部使用预定的轮询 监视某种状态或资源,然后触发消息 交流。由于这是一种常见的模式,轮询组件可以 扩展 ScheduledPollConsumer 基类,使其更简单 实现这个模式。

2) 我如何在文件组件中添加一个简单的时间表来消费 文件 sa 每 30 秒?

使用delay 选项:

from("file://c:/CTest/inbox?noop=true&delay=30000").to("file://C:/Ctest/outbox");

3) 如何通过实现 org.apache.camel.PollingConsumerPollStrategy 创建自己的 pollingStrategy?

查看源代码:DefaultPollingConsumerPollStrategyLimitedPollingConsumerPollStrategy

您使用这样的自定义 pollStrategy:

from("file://inbox/?pollStrategy=#myPoll").to(...)

我在registry 页面底部的更多信息中定义了#myPoll。

【讨论】:

  • 嗨 ebaxt。好的,如果我只想每 30 秒轮询一次,我就不必实施轮询策略吗?我通过使用延迟选项来实现这一点(请注意自我尝试阅读更多内容)。然后对于更复杂的场景,我会定义一个 bean 并使用它来定义一个时间表,例如每周一上午 11:30 轮询?
  • 我刚刚使用了延迟,它就像一个魅力。我不敢相信这很容易。骆驼摇滚!已回答的问题我将进一步研究自定义轮询策略!谢谢。
  • 如果您需要更多地控制轮询时间表,您可以使用石英组件并像这样使用 pollEnrich:from("quartXXXX").pollEnrich("file://xx").to(...);
  • 请注意 pollEnrich 一次只会轮询一个文件。因此,如果您需要轮询目录中的所有文件,那么使用我在下面讨论的计划路由策略可能更容易。
  • @ClausIbsen 很好,很有帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-01
  • 1970-01-01
  • 2015-07-31
  • 1970-01-01
相关资源
最近更新 更多