我们在Talend ESB Studio v6.4中使用Apache Camel
在ESB路由中,我们使用JMS消息,对其进行处理,然后将其发送到HTTP服务器。但是该目标服务器在每个星期六的晚上6点至10点进行维护。
在此期间,我们如何“暂停”消息使用或消息处理?我认为quartz仅适用于文件/ ftp端点。 我们可以使用Processor组件来检查Java是否处在停机期,但是那之后该怎么办?
答案 0 :(得分:2)
有几种方法可以做到这一点。一种实现骆驼的方法是通过CamelControlBus。它接受routeId并对其执行操作(开始/停止/继续等)-在此处了解更多信息以了解Camel ControlBus
但是,您可以采用另一种方法。您可以创建具有3种方法的POJO bean
一个简单的实现可以如下:
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();
}
}
请注意,startRoute
和stopRoute
的参数为*。这是一种根据类型自动绑定参数的骆驼方式。
最后,您可以将此路线添加到主骆驼上下文中,例如:main.addRouteBuilder(new MonitoringRoute());
有关完整的实现,请查看this github repo