Skip to content

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.

0/5
gratuitiesteridefault ordini — source ordiniPostgreSQL smista — route smistaroute gratuiti — sink gratuitifile CSV esteri — sink esteriSQL Server italiani — sink italianiSQL Server
Metodo.route(from, id, { routes }, { deadLetter?, fromPort?, purpose?, writeReport? })
Ingressi1
Uscite≥1 per porta: una per condizione, più default
Dead-lettersì, per record
Codicesrc/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, default compresa: una porta scollegata perderebbe i suoi record in silenzio, quindi build() la rifiuta. Se i record senza corrispondenza non servono, default va a un sink di scarto esplicito.
  • fromPort sempre esplicito: il route non ha una porta predefinita, e un edge senza fromPort è 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 lookup seguito da un route.
  • Il record non cambia: ogni porta porta le colonne dell'ingresso.
  • Mai un join su due rami dello stesso route senza bufferProbe: true: il join legge tutto il build prima del probe, 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.

Noeva è un marchio registrato di 4D S.R.L.