【问题标题】:can ChannelInterceptor know channel name?ChannelInterceptor 可以知道频道名称吗?
【发布时间】:2022-01-22 15:30:40
【问题描述】:

在我的 Spring 项目中,我使用通道拦截器(使用 @GlobalChannelInterceptor 注释注册)来拦截所有通道上的消息。我希望这个拦截器对不同的通道以不同的方式运行 - 例如,对于某些通道,它应该添加标头 A,对于其他一些通道,它应该添加标头 B,等等。当然,我可以只使用几个不同的拦截器(一个添加标题 A,另一个添加标题 B 等)为不同的频道注册,但在我的情况下这是不可能的。这是不可能的,因为我希望这个决定——应该为哪些通道添加哪些标头——是可配置的。所以现在,当我写代码的时候,我什至不知道我需要多少个拦截器,因为这将由配置决定。所以我想要一个拦截器,并在它的 preSend 方法中以某种方式检查当前消息正在发送的通道名称是什么,然后根据这个通道名称决定应该添加哪个标头。

有可能吗?通道拦截器的 preSend 方法是否可以知道通道名称?或者还有其他方法可以实现我的目标吗?

【问题讨论】:

    标签: spring spring-integration


    【解决方案1】:

    preSend()签名:

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

    注意channel arg。 通常,当从依赖注入 Spring 容器中使用 ChannelInterceptor 时,它会应用于 MessageChannel bean。如果你处理标准的 Spring Integration 通道,那么它们都是NamedComponent 的实例。

    因此,您只需将 channel arg 转换为 NamedComponent 并在您的 preSend() impl 中调用它的 getBeanName()

    您也可以在转换之前仔细检查 instanceof,因为在核心 Spring 消息传递中,他们的 MessageChannel impl 不提供获取 bean 名称的钩子。

    另外一个问题,如果你对非bean MessageChannel 应用这样的拦截器,那么它的bean 名称也是null

    【讨论】:

      猜你喜欢
      • 2021-03-01
      • 2014-10-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-16
      • 1970-01-01
      相关资源
      最近更新 更多