我想在发送到目标系统之前使用一些逻辑来验证文件内的数据(以保持数据完整性)。为此,我正在使用这样的文件及其校验和文件逻辑,abc.txt 是原始文件 abc.txt.checksum 是它的校验和文件。abc.txt.checksum 是 abc.txt 文件的哈希值,将用于在发送到目标系统之前进行验证。两个文件将位于同一源位置。我有一个过滤条件,在轮询时不选择 .checksum 文件,因为我不想将 .checksum 文件发送到目标系统。选择 abc.txt 文件后,我将使用一个 java 逻辑在内部创建此文件的哈希并将其存储到内存中,并且必须与已经存在的校验和(abc.txt.checksum)数据进行比较在那个位置。如果两个校验和数据都匹配,那么只有原始文件必须移动到目标系统,否则它不应该处理并抛出错误。有人可以指导我如何实现这一目标吗?或者我将如何获取 .checksum 文件 (abc.txt.checksum),因为它始终存在于源位置?
问问题
58 次
1 回答
0
您所解释的完全是aggregator
组件的逻辑。
您轮询目录中的所有文件,按文件名前缀对它们进行分组。它可以通过correlationKey
针对FileHeaders.FILENAME
消息头的 SpEL 表达式来完成。这样abc.txt
和abc.txt.checksum
将被组合在一起。aggregator
然后,您可以通过存储在标头中MessageGroupProcessor
的方式生成输出消息,checksum
并将原始文件作为单个消息的有效负载来生成。
之后你就可以使用你的验证逻辑了,没有理由再担心一次目录往返。
聚合器的一点,即任何文件在其对到达之前都不会被发送到下游。
在参考手册中查看更多信息:https ://docs.spring.io/spring-integration/reference/html/#aggregator
更新
由于您谈论两个文件(原始文件和校验和),因此您有一个非常简单的ReleaseStrategy
- (group) -> group.size() == 2
. CorrelationStrategy
可以基于生成后与有效负载FileHeaders.FILENAME
一起出现的标头。该函数逻辑可能是这样的:File
FileReadingMessageSource
(message) -> message.getHeaders().get(FileHeaders.FILENAME, String.class).replaceFirst("\.checksum", "")
于 2019-04-19T14:12:26.937 回答