gpt4 book ai didi

java - Spring Integration,全局将无效消息转移到不同的目的地

转载 作者:行者123 更新时间:2023-12-02 01:52:31 25 4
gpt4 key购买 nike

设置

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

问题

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

考虑的潜在选项

channel 拦截器

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

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

这些都不是期望的行为。 JMS 本地事务应始终提交(假设没有其他错误),并且消息要么发送到原始目的地,要么转移到无效的消息 channel 。

路由器

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

AspectJ 切入点

我想到的另一个选择是突破 AspectJ 并在 AbstractMessageSendingTemplate.convertAndSend(destination, Payload, postProcessor) 方法上实现 @Around 建议。这看起来有点侵入性,但看起来似乎可行。如果框架有更好的直接支持选项,我会很高兴听到。

带有效负载路由的通用输入 channel

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

问题

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

非常感谢!

最佳答案

My initial thought was to implement a ChannelInterceptor that matches all the channels where this logic should be applied, but it does not appear that the capability to divert a message can be implemented in a ChannelInterceptor

是什么让你相信这一点? preSend() 可以返回 null,从而有效地终止操作;只需将失败的验证发送到公共(public) channel 并返回 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,但您可以简单地将其吸收到错误 channel 流中。

关于java - Spring Integration,全局将无效消息转移到不同的目的地,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52786226/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com