0

设置

我有一个 JMS 消息传递应用程序,其中包含来自多个 JMS 目标的入站消息。消息有效负载是具有一些常见标头的不同 JSON 表示形式。我依靠 Spring 的动态 Jackson 类型转换ServiceActivators来转换为实际的 POJO。目前路由是微不足道的,因为通道本质上是由 JSON 有效负载类型拆分的“数据类型”通道(它们都是 JSON 字符串有效负载,但 JSON 表示非常不同的对象类型)。

问题

我想将全局验证逻辑应用于多个模式匹配通道中的所有入站消息,例如"*input*"并将无效消息转移到验证错误通道以供审查。无论消息有效还是无效,都应该提交本地JMS事务;如果消息无效,我不希望稍后重新发送无效消息。

考虑的潜在选择

通道拦截器

我最初的想法是实现ChannelInterceptor与应该应用此逻辑的所有通道匹配的 a,但似乎无法在 a 中实现转移消息的功能ChannelInterceptor。看来我的两个选项ChannelInterceptor是:

  1. 当拦截器返回 null on 时,让 JMS 事务回滚preSend,或者
  2. 无效消息仍被发送到原始目的地。

这些都不是所需的行为。应该始终提交 JMS 本地事务(只要没有其他错误),并且消息要么发送到原始目的地,要么转移到无效的消息通道。

路由器

ARouter可能是一个不错的选择,但似乎没有办法将路由器应用于模式匹配的一组通道,所以我相信我必须将它单独应用于每个通道。我希望避免这种重复。

AspectJ 切入点

我想到的另一个选择是拆分 AspectJ 并在该方法上实施@Around建议。AbstractMessageSendingTemplate.convertAndSend(destination, payload, postProcessor)这似乎是侵入性的,但似乎它可以工作。如果有框架直接支持更好的选项,我会很高兴听到它。

带有效负载路由的公共输入通道

如果我找不到全局应用这种类型的路由逻辑的方法,那么另一种选择可能是通过单个通道路由所有入站 JMS 消息。可以将自定义Router应用到该入站通道,该通道使用有效负载类型标头将消息引导到其正确的“数据类型”通道并将无效消息路由到验证错误通道。

问题

  • 有没有办法将这种类型的消息转移应用于模式匹配的一组通道?
  • 我是否错过了 Spring Integration 框架的一项重要功能,该功能将使我的考虑之一起作用?
  • 如果没有,是否有比我提到的更好的 EIP 选项?

非常感谢!

4

2 回答 2

1

我最初的想法是实现一个 ChannelInterceptor 来匹配应该应用此逻辑的所有通道,但似乎无法在 ChannelInterceptor 中实现转移消息的能力

是什么让你相信这一点?preSend()可以返回null有效地终止操作;只需将失败的验证发送到公共通道并返回null

/**
 * Invoked before the Message is actually sent to the channel.
 * This allows for modification of the Message if necessary.
 * If this method returns {@code null} then the actual
 * send invocation will not occur.
 */
@Nullable
default Message<?> preSend(Message<?> message, MessageChannel channel) {
    return message;
}

这将导致MessageDeliveryException入站适配器出现错误,但您可以简单地将其吸收到错误通道流中。

于 2018-10-12T20:48:49.297 回答
1

我的立场不会在全球范围内这样做,ChannelInterceptor因为它很容易陷入不应受到这种过滤逻辑影响的通道的模式。

您始终可以将所有消息发送到同一通道以实现通用逻辑。replyChannel您可以通过在发送到验证通道之前填充的标头控制的路由行为。所以,对我来说,逻辑看起来像:

  1. 每个流执行一个以在流中使用所需的下一步HeaderEnricher填充标题。replyChannel

  2. 在丰富器之后,所有流都Filter使用验证逻辑向组件发送消息。

  3. 在那里,如果失败,您会按照您在问题中解释discardChannel的那样向您发送消息。Filter

  4. replyChannel成功后,除非标题,否则您不会发送任何地方。因此,您的有效消息将返回其原始流。

这对你有意义吗?

于 2018-10-12T21:31:21.793 回答