如何从其他路线选择启动Camel路由?

时间:2018-02-28 13:34:48

标签: apache-camel

从另一条路线选择启动骆驼路线的最佳方法是什么?我的用例是我根据数据库中的表发送自动报告。如果表是陈旧的,则应该开始获取新数据的路径。

我有生成和发送报告的路由,我有一条从远程服务器获取文件的路由,在本地保存文件,将其读入数据库并更新数据库日志(这告诉报告路由是否有数据很新鲜。)

但如何将它们联系在一起?

// write to database
   from(routeFrom)
        .routeId(routeId)
        .to(String.format(BEAN_INIT_DB_TABLE, routeId))
        .to(String.format(BEAN_VALIDATE_TABLE_COLUMNS, routeId))
        .to(String.format(BEAN_LOAD_CSV_FILE_TO_DB, routeId));

// fetch from database
   from(reportFrom)
        .routeId(reportRouteId)
        .to(String.format(BEAN_CHECK_FILEINDB, reportRouteId)
        .to(String.format(BEAN_LOAD_DB_TABLE_TO_XLSX_FILE, reportRouteId)
        .to(BEAN_START_MAIL, reportRouteId);

在上面的 routeFrom 中, routeId reportFrom reportRouteId 在(yml)属性文件中设置,以及其他路线属性。实际繁重的工作是用java bean完成的。

如果数据库中没有当前数据, BEAN_CHECK_FILEINDB 将抛出异常。这可以在骆驼谓词中使用,然后我可以使用骆驼的选择。但是我如何从选择中开始骆驼路线呢?

1 个答案:

答案 0 :(得分:2)

我没有尝试过,但是在评论中使用@ claus-ibsen提到的控制总线功能,它应该是这样的:

.choice()
    .when(<your no-data-available predicate>)
        .to("controlbus:route?routeId=<yourRouteId>&action=suspend")
    .otherwise()
        .to(<continue to process db-contents>);

stopstartsuspendresume可用作操作。如果您想多次停止/启动路线,suspendresume听起来更合适,但我不知道确切的区别。

请注意.to(...)仅接受静态端点地址。如果要将表达式作为路径ID插入,则必须使用.toD(...)