ChannelInterceptor 可以知道频道名称吗?

can ChannelInterceptor know channel name?

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

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

preSend()签名:

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

注意 channel 参数。 通常,当从依赖注入 Spring 容器中使用 ChannelInterceptor 时,它会应用于 MessageChannel bean。如果您处理标准 Spring 集成渠道,那么它们都是 NamedComponent.

的实例

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

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

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