代码之家  ›  专栏  ›  技术社区  ›  Damo

带args的Apache Camel exec

  •  4
  • Damo  · 技术社区  · 15 年前

    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}")
    

    类似于使用文件组件时如何使用文件语言(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);
    

    谢谢。

    2 回复  |  直到 15 年前
        1
  •  7
  •   Claus Ibsen    15 年前

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

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

        2
  •  1
  •   Alan Hollis    10 年前

    我花了很长的时间才明白,所以对于那些在这里绊倒并困惑的人来说。

    在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命令),这些php是通过hashmap/$body中的变量填充的,hashmap/$body是由路由中前面的一个sql查询生成的。