【问题标题】:Channel Interceptor for all type of channels所有类型通道的通道拦截器
【发布时间】: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


    【解决方案1】:

    是的,所有频道类型都调用preSendNullChannel 除外!),这对您的意图来说是最安全的。

    您可以在此处的 Spring 集成代码中找到它:

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

    AbstractPollableChannel 使用的是preReceive,它是QueueChannelRedezevousChannelPriorityChannel 的父级。

    所以preReceive/postReceive/afterReceiveCompletion 不会被DirectChannelExecutorChannelPublishSubscribeChannel 调用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-10-20
      • 2013-04-07
      • 2011-08-04
      • 2018-11-09
      • 2020-08-21
      • 1970-01-01
      • 2014-07-21
      • 1970-01-01
      相关资源
      最近更新 更多