在Apache中轮询文件使用者

时间:2012-03-17 08:42:44

标签: java architecture apache-camel

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

因此,首先要保持基础,我创建了一条路线,如下所示:

 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");

然后我有一些奇怪的例外,因为我无法写一个文件。然后我通过在定时器路由之后放置文件路由它变成了生产者。所以我研究了一下,这里我很困惑。

因此,根据我的理解,文件组件使用预定的轮询模式。文件路由网址模式中甚至还有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");

我试图在这方面得到一些例子,但我要么不是正确的地方,要么完全错过了情节。我想这不是一个与代码相关的问题,而是更多的是这种方法的最佳策略/模式。

由于 Namphibian

2 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分:3)

  

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页面底部的this更多信息中定义了#myPoll。