2011-11-04 4 views
6

Ho un motivo ripetuto nei miei percorsi - una certa processore ha bisogno degli stessi 3 intestazioni stabilite ogni volta lo chiamo io, quindi ho il seguente codice nel miei percorsi circa 10+ volte:Camel: estendere Java DSL?

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

Le intestazioni sono popolate in modo diverso ogni volta, quindi estrapolarlo in una sub-tratta non mi compra davvero nulla.

Quello che mi piace essere in grado di fare è sottoclasse RouteDefinition di avere un altro metodo nel mio DSL che mi permettesse di fare questo:

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

e 'bazProcessor', impostare le intestazioni e chiamare il processore .

Ho provato a farlo ma sembra che sia possibile solo con un serio intervento chirurgico probabilmente non a prova di futuro, e sembra che sia others have had similar luck.

Ho bisogno che siano impostati come intestazioni anziché passarli come parametri direttamente al processore perché i valori vengono anche utilizzati dopo il processore per il routing.

C'è qualche struttura nascosta per ottenere qualcosa di simile?

risposta

6

Con la sottoclasse dello RouteDefinition l'interno sarà visibile solo dopo from(...). Questo potrebbe essere un limite se si desidera utilizzare l'estensione DSL ad esempio dopo il DSL filter(...).

Un approccio più semplice sarebbe quello di incapsulare la logica da qualche parte, e utilizzarlo in una classe che implementa l'interfaccia org.apache.camel.Processor, e quindi chiamare un sovraccarico di .process(...) o bean(...) nel percorso di usare la logica. In effetti, l'estensione DSL sarà molto chiusa se si utilizza un nome significativo per l'istanza Processor o un metodo che restituisce l'istanza Processor. Ecco un example of the suggested approach. Alla fine, il codice potrebbe essere simile:

.Whatever()
.process (setTheHeadersForBaz)
.Whatever()

Solo per riferimento: se si ha realmente bisogno di fai un DSL, c'è un progetto che estende lo Camel DSL based on Groovy. Immagino che un modo Scala basato sulla DSL Camel Scala potrebbe essere anche un'opzione.

+0

Questa è una buona idea. Quello di cui ho bisogno è * leggermente * diverso, ma penso che questo sia un buon inizio. Farò un tentativo e rispondere. –

+0

Puoi per favore dettagliare la tua risposta? Non l'ho capito :( – Edmondo1984

1

Quindi si impostano le intestazioni solo perché si desidera che il processore abbia accesso a tali valori?

Se è così allora un semplice esempio utilizzando una fabbrica potrebbe essere la seguente:

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

Qualora il BazProcessorFactory è solo un wrapper per il vostro processore:

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

Grazie Damo - In realtà ho bisogno che siano impostati come intestazioni - sono usati dal processore ma sono anche usati dopo il processore per gestire alcuni routing. una nota alla domanda originale –

1

Anche se un po 'irrilevante, che segue è un esempio di estensione di Scala DSL.

Possiamo creare un metodo implicito per il tratto DSL tramite una classe implicita.

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

E usarlo in questo modo.

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

Maggiori dettagli @ http://siliconsenthil.in/blog/2013/07/11/apache-camel-with-scala-extending-dsl/

+0

@kleopatra: Grazie .. fatto. :) – siliconsenthil