我试图创建一个频道拦截器,它会将一些数据添加到邮件的标题中,并可能检查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是一个更安全的地方吗?
答案 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
,其中包含preReceive
,QueueChannel
和RedezevousChannel
的父级。
因此PriorityChannel
,preReceive
和postReceive
不会调用afterReceiveCompletion
/ DirectChannel
/ ExecutorChannel
。