Apache Camel exec与args

时间:2010-11-05 03:57:48

标签: apache-camel

使用exec组件时,是否可以指定args内联而不必在ExecBinding.EXEC_COMMAND_ARGS中设置?

例如我有这条路线:

from("seda:getPolicyListStart")
.process(new Processor() {
    public void process(Exchange e) {
        ClientRequestBean requestBean = (ClientRequestBean)e.getIn().getBody();
        List<String> args = new ArrayList<String>();
        args.add(requestBean.getClient());
        args.add(requestBean.getSort());
        e.getOut().setHeader(ExecBinding.EXEC_COMMAND_ARGS, args);
    }
})
.to("exec:some_command?useStderrOnEmptyStdout=true")
.convertBodyTo(String.class)
.log("Executed OS cmd and received: ${body}")

但我觉得我可以使用简单表达式语言来简化它:

from("seda:getPolicyListStart")
.to("exec:some_command?useStderrOnEmptyStdout=true&args=${body.client} ${body.sort}")
.convertBodyTo(String.class)
.log("Executed OS cmd and received: ${body}")

类似于在使用文件组件时如何使用文件语言(简单的子集)。

有可能吗?如果没有,第一个例子可以简化吗?

更新 [解决方案]:

    from(requestNode)
    .routeId(routeId)
    .recipientList(simple("exec:"+osCmd+"?useStderrOnEmptyStdout=true&args=${body.client}"))
    .convertBodyTo(String.class)
    .log("Executed OS cmd and received: ${body}")
    .to(responseNode);

感谢。

2 个答案:

答案 0 :(得分:6)

答案是EIP模式。在运行时计算端点目标时,需要使用动态收件人列表EIP模式。

http://camel.apache.org/recipient-list.html

收件人列表接受表达式,这意味着您可以使用简单语言在运行时构造参数

答案 1 :(得分:1)

这让我理解的时间比应该做的要长得多,所以对于那些在这里跌跌撞撞并且感到困惑的人来说。

在Spring XML中,上面的内容类似于

@Override
protected void onDestroy() {
    // register lifecycle
    application.onDestroy(activity);
    super.onDestroy();
}

@Override
protected void onPause() {
    // register lifecycle
    application.onPause(activity);
    super.onPause();
}

@Override
protected void onResume() {
    // register lifecycle
    application.onResume(activity);
    super.onResume();
}

@Override
protected void onStart() {
    // register lifecycle
    application.onStart(activity);
    super.onStart();
}

在这个例子中,我创建了一个运行某些php(特别是yii 2命令)的动态请求,该命令通过hashmap / $ body中的变量填充,该变量是在路由中较早的sql查询中生成的。