2015-09-18 5 views
3

Я пытаюсь создать канальный перехватчик, который добавит некоторые данные в заголовки сообщения и, возможно, проверит, есть ли информация в MDC (Mapped Diagnostic Context), хотя вторая часть - это то, что Я не начинаю выяснять.Канальный перехватчик для всех типов каналов

Для первой части, я читал документацию и Саидов рессора интеграции в:

Имейте в виду, что получение() вызовы актуальны только для PollableChannels. На самом деле интерфейс SubscribableChannel даже не определяет метод receive(). Причиной этого является то, что когда сообщение отправляется в SubscribableChannel, оно будет отправлено непосредственно одному или нескольким абонентам в зависимости от типа канала (например, публикация PublishSubscribeChannel отправляет всем своим абонентам). Поэтому методы перехвата preReceive (..) и postReceive (..) вызываются только тогда, когда перехватчик применяется к PollableChannel.

Видя интерфейс, который должен быть реализован для перехватчика:

public interface ChannelInterceptor { 

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

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

    void afterSendCompletion(Message<?> message, MessageChannel channel, boolean sent, Exception ex); 

    boolean preReceive(MessageChannel channel); 

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

    void afterReceiveCompletion(Message<?> message, MessageChannel channel, Exception ex); 
} 

Я задавался вопросом, какой из всех этих методов является более безопасным местом, где я должен быть перехватывать сообщение? Поскольку некоторые из них не могут быть выполнены в зависимости от типа канала. Например, например, SubscribableChannel, он не будет выполнять получение, поэтому я предполагаю, что preReceive и postReceive никогда не будут вызваны.

Исходя из этого, могу ли я предположить, что preSend является более безопасным местом для этого?

ответ

2

Да, preSend вызывается для всех типов каналов (кроме NullChannel!) И является самым безопасным для ваших намерений.

Вы можете найти его в Spring Integration код здесь:

AbstractMessageChannel является абстрактным классом для всех типов каналов (кроме NullChannel) использует preSend.

AbstractPollableChannel использует preReceive, который является родителем QueueChannel, RedezevousChannel и PriorityChannel.

Так preReceive/postReceive/afterReceiveCompletion не называются для DirectChannel, ExecutorChannel и PublishSubscribeChannel.

Смежные вопросы