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
。
在我的 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
。