如何在一段时间内暂停消息处理?

时间:2018-07-18 09:39:58

标签: esb talend pause

我们在Talend ESB Studio v6.4中使用Apache Camel

在ESB路由中,我们使用JMS消息,对其进行处理,然后将其发送到HTTP服务器。但是该目标服务器在每个星期六的晚上6点至10点进行维护。

在此期间,我们如何“暂停”消息使用或消息处理?我认为quartz仅适用于文件/ ftp端点。 我们可以使用Processor组件来检查Java是否处在停机期,但是那之后该怎么办?

1 个答案:

答案 0 :(得分:2)

有几种方法可以做到这一点。一种实现骆驼的方法是通过CamelControlBus。它接受routeId并对其执行操作(开始/停止/继续等)-在此处了解更多信息以了解Camel ControlBus

但是,您可以采用另一种方法。您可以创建具有3种方法的POJO bean

  • shouldRouteStop():检查当前时间并确定是否应该停止您的路线。
  • startRoute():如果路线被暂停,则启动该路线
  • stopRoute():如果路由已启动,则将其挂起

一个简单的实现可以如下:

public class ManagementBean {
 public boolean shouldRouteStop() {
    // Mocking the decision here
    return new Random().nextBoolean();
 }
 public void startRoute(org.apache.camel.CamelContext ctx) throws Exception {
    if (ctx.getRouteStatus("GenerateInvoices") == ServiceStatus.Suspended)
        // replace the argument with your route Id
        ctx.resumeRoute("GenerateInvoices");
 }
 public void stopRoute(org.apache.camel.CamelContext ctx) throws Exception {
    if (ctx.getRouteStatus("GenerateInvoices") == ServiceStatus.Started)
        // replace the argument with your route Id
        ctx.suspendRoute("GenerateInvoices");
 }
}

确保您要控制的jms-route具有routeId,并将此bean像这样添加到基本/默认CamelContext中

main.bind("manageRouteBean", new ManagementBean());

创建另一个基于计时器的路由,该路由会在每个刻度上检查是否应停止该路由,然后通过routeId挂起或恢复该路由。此路由可以如下实现:

public class MonitoringRoute extends RouteBuilder {
 @Override
 public void configure() throws Exception {
    onException(Exception.class).log(exceptionMessage().toString());

    from("timer:time?period=10000")
            .choice()
            .when().simple("${bean:manageRouteBean?method=shouldRouteStop}")
            .log("Route Should Stop")
            .bean(ManagementBean.class, "stopRoute(*)")
            .otherwise()
            .log("Route Should Start")
            .bean(ManagementBean.class, "startRoute(*)")
            .end();
 }
}

请注意,startRoutestopRoute的参数为*。这是一种根据类型自动绑定参数的骆驼方式。

最后,您可以将此路线添加到主骆驼上下文中,例如:main.addRouteBuilder(new MonitoringRoute());

有关完整的实现,请查看this github repo