我想在发送到目标系统之前使用某种逻辑来验证文件中的数据(以保持数据完整性)。为此,我正在使用文件及其校验和文件逻辑, abc.txt是原始文件abc.txt.checksum是其校验和文件。 abc.txt.checksum是abc.txt文件的哈希,将用于在发送到目标系统之前进行验证。两个文件都位于同一源位置。 我有一个筛选条件,可以在轮询时不选择.checksum文件,因为我不想将.checksum文件发送到目标系统。 一旦选择了abc.txt文件,我就使用一种Java逻辑在内部创建此文件的哈希并将其存储到内存中,并且必须将其与 该位置已经存在的校验和(abc.txt.checksum)数据。如果两个校验和数据都匹配,则仅要将原始文件移至目标系统,否则它将不进行处理并引发错误。 有人可以指导我如何实现这一目标吗?或如何获取.checksum文件(abc.txt.checksum),因为它始终位于源位置中?
答案 0 :(得分: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", "")