使用
exec
组件时,是否可以内联指定参数,而不必在 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}")
类似于使用文件组件时使用文件语言(简单的子集)的方式。
可能吗?如果不是的话,第一个例子可以简化一下吗?
答案就在 EIP 模式中。在运行时计算端点目标时,您需要使用动态收件人列表 EIP 模式。
http://camel.apache.org/recipient-list.html
收件人列表接受一个表达式,这意味着您可以在运行时使用简单语言构造参数
这让我花了比应该做的更长的时间来理解,所以对于其他在这里绊倒并感到困惑的人来说。
在 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]}&workingDir={{reporting.folder}}</simple>
</recipientList>
在这个示例中,我创建了一个动态请求来运行一些 php (特别是 yii 2 命令),该请求通过 hashmap/$body 中的变量填充,该变量是从路线中之前的 sql 查询生成的。