Tema
Nodo: route
Smistamento esclusivo: ogni record esce su una sola porta con nome, quella della prima condizione vera nell'ordine in cui sono scritte, oppure su default se nessuna è vera. È il tMap con più output di Talend. Nessun record sparisce.
| Metodo | .route(from, id, { routes }, { deadLetter?, fromPort?, purpose?, writeReport? }) |
|---|---|
| Ingressi | 1 |
| Uscite | ≥1 per porta: una per condizione, più default |
| Dead-letter | sì, per record |
| Codice | src/core/route.ts |
Quando usarlo
Quando record diversi devono andare su rami diversi: destinazioni diverse, trattamenti diversi, scarti espliciti. Se lo stesso record deve andare su tutti i rami, non serve un nodo: è un fan-out, più nodi con lo stesso from.
Esempio
ts
.route<Ordine>("ordini", "smista", {
routes: {
gratuiti: (o) => o.importo === 0, // valutate in quest'ordine: vince la prima vera
esteri: (o) => o.paese !== "IT",
},
}, { deadLetter: scarti })
.sink("smista", gratuiti, { fromPort: "gratuiti" })
.transform("smista", "iva-estera", ivaEstera, { fromPort: "esteri" })
.sink("smista", italiani, { fromPort: "default" })Un ordine gratuito ed estero va su gratuiti: la prima condizione vera vince.
Regole
- Ogni porta va collegata,
defaultcompresa: una porta scollegata perderebbe i suoi record in silenzio, quindibuild()la rifiuta. Se i record senza corrispondenza non servono,defaultva a un sink di scarto esplicito. fromPortsempre esplicito: ilroutenon ha una porta predefinita, e un edge senzafromPortè un errore che elenca le porte.- Più edge sulla stessa porta sono un fan-out di quella porta.
- Predicati puri e sincroni. Una condizione che ha bisogno di IO è un
lookupseguito da unroute. - Il record non cambia: ogni porta porta le colonne dell'ingresso.
- Mai un
joinsu due rami dello stessoroutesenzabufferProbe: true: il join legge tutto ilbuildprima delprobe, e lo smistamento si bloccherebbe.build()lo rifiuta.
Errori
Un predicato che lancia un EtlError segue la semantica di una transform: dead-letter del nodo, ramo catch sotto un try-catch, altrimenti fail-fast.
Nel report
nodes[id].ports conta i record usciti su ogni porta, zeri compresi.
Nei contatori dal vivo il route è un fan-out: il suo in lavorazione sono i record nel buffer che non tutte le porte hanno ancora preso, e dice quale ramo è il più lento.
Anti-pattern
Più filterTransform in parallelo per smistare: valutano il predicato N volte, non garantiscono rami esclusivi e perdono i record che non passano nessun filtro.

