设置
我有一个 JMS 消息传递应用程序,其中包含来自多个 JMS 目标的入站消息。消息有效负载是具有一些常见标头的不同 JSON 表示形式。我依靠 Spring 的动态 Jackson 类型转换ServiceActivators
来转换为实际的 POJO。目前路由是微不足道的,因为通道本质上是由 JSON 有效负载类型拆分的“数据类型”通道(它们都是 JSON 字符串有效负载,但 JSON 表示非常不同的对象类型)。
问题
我想将全局验证逻辑应用于多个模式匹配通道中的所有入站消息,例如"*input*"
并将无效消息转移到验证错误通道以供审查。无论消息有效还是无效,都应该提交本地JMS事务;如果消息无效,我不希望稍后重新发送无效消息。
考虑的潜在选择
通道拦截器
我最初的想法是实现ChannelInterceptor
与应该应用此逻辑的所有通道匹配的 a,但似乎无法在 a 中实现转移消息的功能ChannelInterceptor
。看来我的两个选项ChannelInterceptor
是:
- 当拦截器返回 null on 时,让 JMS 事务回滚
preSend
,或者 - 无效消息仍被发送到原始目的地。
这些都不是所需的行为。应该始终提交 JMS 本地事务(只要没有其他错误),并且消息要么发送到原始目的地,要么转移到无效的消息通道。
路由器
ARouter
可能是一个不错的选择,但似乎没有办法将路由器应用于模式匹配的一组通道,所以我相信我必须将它单独应用于每个通道。我希望避免这种重复。
AspectJ 切入点
我想到的另一个选择是拆分 AspectJ 并在该方法上实施@Around
建议。AbstractMessageSendingTemplate.convertAndSend(destination, payload, postProcessor)
这似乎是侵入性的,但似乎它可以工作。如果有框架直接支持更好的选项,我会很高兴听到它。
带有效负载路由的公共输入通道
如果我找不到全局应用这种类型的路由逻辑的方法,那么另一种选择可能是通过单个通道路由所有入站 JMS 消息。可以将自定义Router
应用到该入站通道,该通道使用有效负载类型标头将消息引导到其正确的“数据类型”通道并将无效消息路由到验证错误通道。
问题
- 有没有办法将这种类型的消息转移应用于模式匹配的一组通道?
- 我是否错过了 Spring Integration 框架的一项重要功能,该功能将使我的考虑之一起作用?
- 如果没有,是否有比我提到的更好的 EIP 选项?
非常感谢!