移动到目标系统之前的文件数据验证

File data validation before moving to the target system

我想在发送到目标系统之前使用一些逻辑验证文件内的数据(以保持数据完整性)。为此,我正在使用这样的文件及其校验和文件逻辑, abc.txt是原始文件abc.txt.checksum是它的校验和文件。 abc.txt.checksum 是 abc.txt 文件的哈希值,将用于在发送到目标之前进行验证 system.Both 文件将驻留在相同的源位置。 我有一个过滤条件,在轮询时不选择 .checksum 文件,因为我不想将 .checksum 文件发送到目标系统。 选择 abc.txt 文件后,我将使用一个 java 逻辑在内部创建该文件的哈希值并将其存储到内存中,并且必须与 该位置已经存在的校验和(abc.txt.checksum)数据。如果两个校验和数据匹配,则只需将原始文件移动到目标系统,否则它不应该处理并抛出错误。 有人可以指导我如何实现这一目标吗?或者我将如何获取 .checksum 文件 (abc.txt.checksum),因为它始终位于源位置?

您所解释的完全是 aggregator 组件的逻辑。

您轮询目录中的所有文件,按文件名前缀对它们进行分组。可以通过针对 FileHeaders.FILENAME 消息 header 的 correlationKey 的 SpEL 表达式来完成。这样 abc.txtabc.txt.checksum 将被组合在一起。 然后,您可以通过 MessageGroupProcessoraggregator 生成输出消息,方法是 checksum 存储在 header 中,并将原始文件作为要生成的单个消息的有效负载.

之后您就可以使用您的验证逻辑了,没有理由担心再进行一次目录往返。

聚合器的一点是,任何文件在其对到达之前都不会被发送到下游。

在参考手册中查看更多信息:https://docs.spring.io/spring-integration/reference/html/#aggregator

更新

既然你谈到了两个文件(原始文件和校验和),那么你有一个非常简单的 ReleaseStrategy - (group) -> group.size() == 2CorrelationStrategy 可以基于 FileHeaders.FILENAME header,它在 FileReadingMessageSource 生成后与 File 有效载荷一起出现。该功能逻辑可能是这样的:

(message) -> message.getHeaders().get(FileHeaders.FILENAME, String.class).replaceFirst("\.checksum", "")