2013-01-24 17 views
6

Apache Camel offre diversi modi per eseguire trasformazioni di dati: il suo concetto di Transform EIP, DataFormats personalizzati, nonché la sua tolleranza per i convertitori di tipi personalizzati.Quale costrutto Camel è adatto alla trasformazione?

Ho una situazione in cui ho bisogno di fare una trasformazione molto complessa dall'interno di un percorso Camel. Dovrei essere attuare il mio tipo di convertitore, la mia DataFormat, o dovrei implementare org.apache.camel.Expression e mettere tutte le cose trasformarsi in là:

public class MyTransformer implements Expression { 
    @Override 
    public <T> T evaluate(Exchange arg0, Class<T> arg1) { 
     // ... 
    } 
} 

Credo di essere confuso su dove/quando è opportuno utilizzare il proprio Digitare Convertitore, quando utilizzare il processore .transform(myTransformer) o quando utilizzare un DataFormat personalizzato. Grazie in anticipo!

risposta

9

Le differenze sono sottili, anche se sono tutte utilizzate per cose diverse. È necessario utilizzare:

  • a transformer quando si converte un "carico utile aziendale" da una forma all'altra. Ad esempio, quando si convertono oggetti di valore estratti da un DAO in oggetti annotati JAXB che si intende utilizzare per richiamare un servizio web.
  • a data format quando si desidera eseguire il marshalling di una rappresentazione di alto livello, ad esempio un tipo di oggetto, in una rappresentazione di livello inferiore, qualcosa che si invierà su un filo. I formati dei dati includono la serializzazione, i buffer del protocollo Google, JSON, JAXB ecc.
  • a type converter quando si modifica il modo in cui si accede a una rappresentazione di un messaggio. Per esempio. una stringa e un array di byte o un InputStream continuano a leggere gli stessi caratteri, quindi è possibile scrivere (anche se in realtà esistono convertitori incorporati) che convertono tra due qualsiasi di questi.
2

Solo per aggiungere ciò che Jake ha detto sopra. Tutto dipende.

E non è necessario utilizzare alcuna delle API Camel per farlo. Ci possono essere situazioni in cui è necessario trasformare il carico utile del messaggio solo una o poche volte. E per questo è possibile utilizzare un POJO semplice e richiamarlo da un percorso Camel ecc.

Ad esempio un metodo in un POJO che converte una stringa in un'istanza MyOrder.

public MyOrder doSomething(String data) { 
    ... 
    return ... 
} 

e quindi utilizzare una chiamata di metodo nel trasformatore messaggio nel percorso

.transform().method(MyBusinessClass.class, "doSomething") 

Anche se utilizzando uno qualsiasi dei modi Camel per il messaggio di trasformazione come risposta Jake, consente di integrare questo senza soluzione di continuità in cammello e usalo come cittadino di prima classe dato che è stato fornito fuori dalla scatola dalla stessa Camel. E ti consente di riutilizzarlo in altre rotte e applicazioni Camel.

Implementazione di org.apache.camel.Espressione per trasformare il carico del messaggio non viene utilizzata così spesso. Ci sono modi migliori come dice Jake. O usare un POJO come mostrato sopra. Sebbene il POJO di cui sopra venga infine valutato come org.apache.camel.Expression, e quindi perché è possibile implementarlo una volta e usarlo anche tu.

Se hai una copia di Camel in Action book, il capitolo 3 trasforma tutti i dati con Camel.