2010-11-05 6 views
4

Lors de l'utilisation du composant exec, est-il possible de spécifier des arguments en ligne plutôt que de les définir dans le ExecBinding.EXEC_COMMAND_ARGS?Apache Camel exec avec arguments

Par exemple, j'ai cette route:

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

Cependant, j'aurais pensé que je pouvais utiliser le langage simple d'expression pour simplifier comme ceci:

from("seda:getPolicyListStart") 
.to("exec:some_command?useStderrOnEmptyStdout=true&args=${body.client} ${body.sort}") 
.convertBodyTo(String.class) 
.log("Executed OS cmd and received: ${body}") 

similaires à la façon dont vous pouvez utiliser File Language (un sous-ensemble de Simple) lorsque vous utilisez le composant de fichier.

Est-ce possible? Si non, le premier exemple peut-il être simplifié?

MISE À JOUR [solution]:

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

Merci.

Répondre

6

La réponse est dans les modèles EIP. Vous devez utiliser le modèle EIP de la liste des destinataires dynamiques lorsque vous calculez une destination de noeud final au moment de l'exécution.

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

La liste des destinataires accepte une expression qui signifie que vous pouvez utiliser le langage simple pour construire les paramètres lors de l'exécution

+0

Merci. Je vais vérifier ça. – Damo

+0

Génial. Cela fonctionne un régal. J'ai mis à jour ma question avec la solution. – Damo

0

Cela m'a pris beaucoup plus de temps à comprendre qu'il devrait de fait, donc pour d'autres qui trébucher ici et se confondre.

En XML printemps les regards ci-dessus comme

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

Dans cet exemple, je crée une demande dynamique pour exécuter certains php (en particulier une commande yu 2) qui est peuplée par des variables dans le hashmap/corps $ qui a été généré à partir d'une requête sql plus tôt dans la route.