适用于所有类型频道的频道拦截器

时间:2015-09-18 18:06:19

标签: java spring spring-integration

我试图创建一个频道拦截器,它会将一些数据添加到邮件的标题中,并可能检查MDC(映射诊断上下文)中是否有信息,尽管第二部分是我的内容没有开始搞清楚。

对于第一部分,我正在阅读spring integration的文档并说:

  

请记住,receive()调用仅与PollableChannels相关。实际上,SubscribableChannel接口甚至没有定义receive()方法。其原因在于,当消息被发送到SubscribableChannel时,它将根据信道的类型直接发送给一个或多个订户(例如,PublishSubscribeChannel发送给其所有订户)。因此,仅当拦截器应用于PollableChannel时才会调用preReceive(..)和postReceive(..)拦截器方法。

查看需要为拦截器实现的接口:

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);
}

我想知道所有这些方法中哪一个更安全,我应该拦截这个消息?由于其中一些根据Channel类型无法执行。就像SubscribableChannel一样,它不会执行接收,所以我假设preReceive和postReceive将永远不会被调用。

基于此,我可以假设preSend是一个更安全的地方吗?

1 个答案:

答案 0 :(得分:2)

是的,$('.container').on('mousemove', function(e){ var cPos = sPos - e.pageX; if(isDragging && ((tWidth - handle.next().width()) - cPos) <= tWidth){ handle.prev().width((tWidth - handle.next().width()) - cPos); handle.next().width(tWidth - handle.prev().width()); sPos = e.pageX; } }); 适用于所有频道类型(preSend除外!),对您的意图最安全。

您可以在Spring Integration代码中找到它:

AbstractMessageChannel是所有通道类型的抽象类(NullChannel除外)并使用NullChannel

AbstractPollableChannel正在使用preSend,其中包含preReceiveQueueChannelRedezevousChannel的父级。

因此PriorityChannelpreReceivepostReceive不会调用afterReceiveCompletion / DirectChannel / ExecutorChannel