【发布时间】:2015-12-15 23:32:20
【问题描述】:
我正在尝试创建一个通道拦截器,它将一些数据添加到消息的标题中,并可能检查 MDC(映射诊断上下文)中是否有信息,尽管第二部分是我尚未开始弄清楚的内容.
对于第一部分,我正在阅读 spring 集成的文档并说:
请记住,receive() 调用仅与 PollableChannel 相关。事实上,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);
}
我想知道在所有这些方法中,哪一种方法是我应该拦截消息的更安全的地方?由于其中一些无法根据 Channel 类型执行。例如,像 SubscribableChannel 一样,它不会执行接收,所以我假设 preReceive 和 postReceive 永远不会被调用。
基于此,我可以假设 preSend 是一个更安全的地方吗?
【问题讨论】:
标签: java spring spring-integration