apache camel带有来自端点的石英和自定义组件

时间:2013-04-17 14:33:06

标签: apache-camel

我正在开发自定义的驼峰组件。它只有消费者支持意味着它可以在从仅端点中调用。我们假设我的自定义组件使用'mycomp'方案注册。

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

从( “mycomp:东西”),以( “文件:数据/发件箱”);

以上路线正在运行,因为我已经为端点提供了createConsumer()

的实现

要求2:现在,我们还有另一项要求,即在特定时间启动上述路线。 (假设每天上午08:00)

对于Req2,我决定使用驼峰石英组件。我们知道,quartz还支持仅来自端点,而来自端点的我的req2将会像..

从( “石英:// myTimer的cron = 0 + 0 + 8 + * + + * *”)

现在,问题:

我的自定义组件需要来自()端点,并且还需要在特定时间触发。但是quartz也只能使用from()端点。在Camel中,我不能有两个来自...的路由(“xxx”)。来自(“yyy”)..

解决方法之一:

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

从( “石英:// myTimer的cron = 0 + 0 + 8 + * + + * *”).process(ProcessorWhich_的 StartsMyRoute );

从( “mycomp:东西”)。的 noAutoStartup ()的路由ID ( “ MyRoute ”)到(“文件:。数据/发件箱“);

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

从( “石英:// myTimerStop的cron = 0 + 30 + 8 + * + + * *”).process(ProcessorWhich_的 StopsMyRoute );

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

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

2 个答案:

答案 0 :(得分:0)

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

与此同时,我找到了另一种方法来实现这一目标。

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

<强>路线:

从( “石英:// myTimer的cron = 0 + 0 + 8 + * + + * *”).process(ProcessorWhich_的 SuspendResumeMyRoute );

从( “mycomp:东西”)noAutoStartup()路由ID( “MyRoute”)来。( “文件:数据/发件箱”);

<强>处理器

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

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

答案 1 :(得分:0)

可能只是使用cron-sheduled路线政策?

这是一个有用的链接 - documentation

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

例如;

CronScheduledRoutePolicy yourPolicy = new CronScheduledRoutePolicy();

//set start time etc on your policy 

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