2011-11-04 4 views
6

J'ai un motif répétitif dans mes voies - un certain processeur a besoin des mêmes 3 têtes fixés chaque fois que je l'appelle, j'ai le code suivant dans mes itinéraires sur les 10+ fois:Camel - étendre Java DSL?

.whatever() 
.setHeader("foo1", "bar1") 
.setHeader("foo2", "bar2") 
.setHeader("foo3", "bar3") 
.processRef("processorBazThatNeedsHeaders") 
.whatever() 

Les en-têtes sont peuplés différemment à chaque fois, donc l'abstraction dans un sous-programme ne m'achète rien.

Ce que j'aime être en mesure de faire est la sous-classe RouteDefinition d'avoir une autre méthode dans mon DSL qui me permettrait de le faire:

.whatever() 
.bazProcessor("bar1", "bar2", "bar3") 
.whatever() 

et « bazProcessor », définissez les en-têtes et appeler le processeur .

J'ai essayé de le faire mais il semble que ce n'est possible qu'avec une chirurgie sérieuse probablement sans avenir, et il semble que others have had similar luck.

J'ai besoin qu'ils soient définis comme en-têtes plutôt que de les transmettre directement au processeur car les valeurs sont également utilisées après le processeur pour le routage.

Y a-t-il des possibilités cachées pour réaliser quelque chose comme ça?

Répondre

6

En sous-classant le RouteDefinition votre extension ne sera visible directement qu'après from(...). Cela pourrait être une limitation si vous souhaitez utiliser l'extension DSL par exemple après le filter(...) DSL.

serait une approche plus simple de résumer quelque part la logique, et l'utiliser dans une classe qui implémente l'interface org.apache.camel.Processor, puis appeler une surcharge de .process(...) ou bean(...) dans la voie d'utiliser la logique. Vous serez en fait très fermé à une extension DSL si vous utilisez un nom explicite pour l'instance Processor ou une méthode qui renvoie cette instance Processor. Voici un example of the suggested approach. A la fin, votre code pourrait ressembler à:

.Whatever()
poids.Procédé (setTheHeadersForBaz)
.Whatever()

Juste pour référence: si vous avez vraiment besoin faire un DSL, il y a un projet qui étend le Camel DSL based on Groovy. Je suppose qu'un Scala basé sur le Camel Scala DSL pourrait aussi être une option.

+0

Ceci est une bonne idée. Ce dont j'ai besoin est * légèrement * différent mais je pense que c'est un bon début. Je vais essayer et répondre. –

+0

Pouvez-vous s'il vous plaît détailler votre réponse? Je ne l'ai pas compris :( – Edmondo1984

1

Vous ne définissez donc les en-têtes que parce que vous souhaitez que le processeur ait accès à ces valeurs?

Si oui, alors un exemple simple en utilisant une usine pourrait ressembler à ceci:

whatever() 
    .process(BazProcessorFactory.instance("bar1", "bar2", "bar3")) 
    .whatever() 

Lorsque le BazProcessorFactory est juste un wrapper autour de votre processeur:

public class BazProcessorFactory { 
    public Processor instance(final String...vals) { 
    return new Processor() { 
     @Override 
     public void process(Exchange exchange) throws Exception { 
     //access your array of values here 
     System.out.println("Foo1 = "+vals[0]); 
     } 
    } 
    } 
} 
+0

Merci Damo - J'ai en fait besoin qu'ils soient définis comme en-têtes - ils sont utilisés par le processeur mais ils sont également utilisés après le processeur pour gérer le routage. une note à la question originale –

1

Bien que légèrement hors de propos, voici un exemple d'extension Scala DSL.

Nous pouvons créer des méthodes implicites de trait DSL via une classe implicite.

object DSLImplicits { 
    implicit class RichDSL(val dsl: DSL) { 
    def get = dsl.setHeader(Exchange.HTTP_METHOD, _ => HttpMethods.GET.name) 

    def post = dsl.setHeader(Exchange.HTTP_METHOD, _ => HttpMethods.POST.name) 
    } 
} 

Et l'utiliser comme ça.

import DSLImplicits.RichDSL 
//---------------------------- 
from("someWhere") 
    //Do some processing 
    .get.to("http://somewhere.com") 

Plus de détails @ http://siliconsenthil.in/blog/2013/07/11/apache-camel-with-scala-extending-dsl/

+0

@kleopatra: Merci .. fait :) – siliconsenthil

Questions connexes