0

我正在开发自定义骆驼组件。它只有消费者支持意味着它只能从端点调用。假设我的自定义组件注册了“mycomp”方案。

需求 1:我们有需要支持以下路线的用例。

from("mycomp:Something").to("file:data/outbox");

上面的路线正在工作,因为我已经为端点提供了 createConsumer() 的实现

需求 2:现在,我们还有一个要求是在特定时间从上述路线开始。(假设每天早上 08:00)

对于 Req2,我决定使用骆驼石英组件。正如我们所知,石英也只支持来自端点和我的 req2 的端点,就像..

来自("quartz://myTimer?cron=0+0+8+*+*+*")

现在,问题:

我的自定义组件需要 from() 端点,它还需要在特定时间触发。但石英也仅适用于 from() 端点。在 Camel 中,我不能有两条 from 像 .. from("xxx").from("yyy") ..

解决方法之一:

我可以开发为“mycomp”定义的启动路线的处理器,最终路线将类似于..

from("quartz://myTimer?cron=0+0+8+*+*+*") .process (ProcessorWhich_StartsMyRoute );

来自(“mycomp:某事”)。没有自动启动()。routeId (" MyRoute ").to("file:data/outbox");

但是我再次需要想出一个处理器,它使用石英调度在特定时间停止 MyRoute .. 它会像..

from("quartz://myTimerStop?cron=0+30+8+*+*+*") .process (ProcessorWhich_StopsMyRoute );

上面,我在上午 8 点 30 分停下来。但这是此解决方案的限制,在现实生活中,我不知道什么是停止 MyRoute 的安全时间。

请分享您对如何实现 Req1 和 Req2 的想法/意见。请询问您是否需要有关我的用例的更多详细信息。

4

2 回答 2

0

只需使用 cron-shedled 路由策略,也许?

这是一个有用的链接 -文档

只需创建一个新策略,设置开始时间或停止时间或任何您想要的,然后将策略添加到您的路线。

例如;

CronScheduledRoutePolicy yourPolicy = new CronScheduledRoutePolicy();

//set start time etc on your policy 

    from("mycomp:Something").routePolicy(yourPolicy).
    noAutoStartup().
    routeId("MyRoute").
    to("file:data/outbox");
于 2013-04-18T11:58:19.350 回答
0

第二种解决方法/解决方案:

同时,我找到了另一种方法来实现这一点。

我开发了一个处理器,它首先调用suspendRoute(),然后立即调用resumeRoute()方法来使用'mycomp'方案进行路由..如下所示..

路线:

from("quartz://myTimer?cron=0+0+8+*+*+*").process(ProcessorWhich_SuspendResumeMyRoute ) ;

from("mycomp:Something").noAutoStartup().routeId("MyRoute").to("file:data/outbox");

处理器

    public void process(Exchange exchange) throws Exception {
        CamelContext ctx = exchange.getContext();
        ctx.suspendRoute(routeName);
        ctx.resumeRoute(routeName);
    }

现在,在以上两个中;第二个看起来更接近理想的解决方案。任何人都可以像上面那样分享挂起()和恢复()路线所需要的(性能和设计)。使用第二种解决方案,MyRoute 将在上午 8:00 开始,第二天在上午 8:00 再次开始,它首先暂停,然后恢复,第三天再次在上午 8:00 ..暂停然后恢复。

于 2013-04-18T02:50:12.170 回答