Spring Integration fornisce diverse implementazioni dell’interfaccia Message Channel, ne descrivo brevemente alcune.
Publish Subscribe Channel
Tutti i messagi inviati a questo tipo di canali vengono spediti in broadcast ai propri sottoscrittori.
È molto utilizzata per l’invio di Messaggi di Eventi. Si noti che questo canale è utilizzabile solamente per la spedizione dei messaggi: i Consumer non possono effettuare il Polling in quanto non implementa l’interfaccia PollableChannel e dunque non mette a disposizione alcun metodo receive().
Ogni sottoscrittore deve essere un MessageHandler ed il suo metodo handleMessage(Message) sarà evocato a turni.
Queue Channel
Si tratta del wrapper di una coda ed implementa una semantica point-to-point, contrariamente alla PublishSubscribe Channel. In altre parole, anche se il canale ha più sottoscrittori, solo uno di essi dovrebbe ricevere ogni messaggio inviato al canale.
Fornisce un costruttore senza parametri ed un altro nel quale inserire la capacità della coda:
public QueueChannel(int capacity)
Un canale che non ha raggiunto il limite di capacità della sua coda interna immagazinerà i nuovi messaggi al suo interno anche se in quel momento non è disponibile alcun Handler pronto a ricevere il messaggio (dunque la relativa send() restituirà true immediatamente).
Se invece la coda è piena, la funzione send() rimarrà bloccata fino alla disponibilità di uno slot, ammenochè non si utilizzi il metodo send() che accetta un time out.
In modo simile il metodo receive() restituirà il messaggio immediatamente se ve ne è almeno uno disponibile all’interno della coda, altrimenti resterà in attesa (eventualmente fino alla scadenza di un time out).
Priority Channel
Si tratta di un’implementazione alternativa a quella FIFO della Queue Channel che permette l’ordinamento dei messaggi in base alla loro priorità. Di default questa è determinata dall’attributo ‘priority’ presente nell’header del messaggio.
Per calcolare la priorità in modo differente, può essere fornito al costruttore della Priority Channel un comparatore di tipo
Comparator<Message<?>>
Il channel utilizzato di default è il Direct Channel (vedi anche l’Executor Channel).