2010-11-05 77 views
4

使用exec組件時,可以指定內聯而不是將它們設置爲ExecBinding.EXEC_COMMAND_ARGS帶參數的Apache Camel exec

例如,我有這樣的路線:

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

類似於你如何使用文件語言(簡單的一個子集),當您使用文件組件。

可能嗎?如果不是,第一個例子可以簡化嗎?

UPDATE [溶液]:

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

感謝。

回答

6

答案是EIP模式。在運行時計算端點目標時,您需要使用動態收件人列表EIP模式。

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

收件人列表接受,這意味着你可以用簡單的語言在運行時

+0

謝謝。我會檢查一下。 – Damo 2010-11-05 05:36:53

+0

太好了。這是一種享受。我已經用解決方案更新了我的問題。 – Damo 2010-11-07 21:33:49

0

構建參數這把我遠遠更長的時間來了解比它應該的做的表情,讓別人說絆倒在這裏,感到困惑。

在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命令),其經由變量的散列映射/ $體填充這是從前面的一條sql查詢生成的。