Spring Integration Channel Interceptors

Uno dei vantaggi di utilizzare Spring Integration ed in generale un’architettura a messaggi è la possibilità di catturare informazioni utili in modo non invasivo durante lo scambio dei messaggi. In particolare, i Message Channel permettono di intercettare le operazioni di send() e receive(). Tutto questo ci è fornito dall’interfaccia ChannelInterceptor:


public interface ChannelInterceptor {

    Message<?> preSend(Message<?> message, MessageChannel channel);

    void postSend(Message<?> message, MessageChannel channel, boolean sent);

    boolean preReceive(MessageChannel channel);

    Message<?> postReceive(Message<?> message, MessageChannel channel);
}
[ . . . ]
channel.addInterceptor(someChannelInterceptor);

I metodi che restituiscono un messaggio possono essere utilizzati per effettuare delle trasformazioni su di esso o restituire null per evitare che il processo vada avanti.

Anche il metodo preReceive() potrebbe restituire false per bloccare la chiamata della funzione receive().

Com’è possibile immaginare, il più delle volte non si ha l’esigenza di implementare tutti i metodi dell’interfaccia ma forse solo uno o due. Per questo motivo viene anche fornita una classe ChannelInterceptorAdapter che fornisce dei metodi no-operation: il metodo void è vuoto, il primo e l’ultimo restituiscono il messaggio così com’è ed il metodo booleano restituisce true. Ecco un esempio di utilizzo:


public class CountingChannelInterceptor extends ChannelInterceptorAdapter {

    private final AtomicInteger sendCount = new AtomicInteger();

    @Override
    public Message<?> preSend(Message<?> message, MessageChannel channel) {
        sendCount.incrementAndGet();
        return message;
    }
}

Si noti che l’ordine di invocazione dei metodi può variare e dipende dal tipo di canale. I canali basati sulle code sono gli unici ove il metodo di receive è intercettato per primo.

Inoltre la relazione tra l’intercettazione di send e receive dipende dal timing dei rispettivi thread.

Leave a Reply