5

使用exec组件时,是否可以指定 args inline 而不必在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}")

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

是否可以?如果不是,可以简化第一个示例吗?

更新[解决方案]:

    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);

谢谢。

4

2 回答 2

7

答案就在 EIP 模式中。在运行时计算端点目的地时,您需要使用动态收件人列表 EIP 模式。

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

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

于 2010-11-05T05:17:35.497 回答
1

这花了我更长的时间来理解,而不是应该做的,所以对于其他在这里绊倒并感到困惑的人。

在 Spring XML 中,上面看起来像

<recipientList>
   <simple>exec:/usr/bin/php?args=yii individual-participant-report/runreport ${body[assessment_id]} ${body[scope_id]} ${body[participation_id]} ${body[participation_email]}&amp;workingDir={{reporting.folder}}</simple>
</recipientList>

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

于 2016-07-22T17:56:49.537 回答