5

コンポーネントを使用する場合、 ?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}")

ただし、Simple Expression Languageを使用して、次のように単純化できると思いました。

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

受信者リストは式を受け入れます。これは、Simple 言語を使用して実行時にパラメーターを構築できることを意味します

于 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>

この例では、ルートの前半で sql クエリから生成された hashmap/$body の変数を介して入力される、いくつかの php (具体的には yii 2 コマンド) を実行するための動的リクエストを作成しています。

于 2016-07-22T17:56:49.537 に答える