移至目标系统之前进行文件数据验证

时间:2019-04-19 10:43:09

标签: spring spring-boot spring-integration spring-integration-aws

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

1 个答案:

答案 0 :(得分:0)

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

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

之后,您可以很好地使用验证逻辑,而无需担心再进行一次目录往返。

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

请参阅参考手册中的更多信息:https://docs.spring.io/spring-integration/reference/html/#aggregator

更新

由于您谈论的是两个文件(原始文件和校验和文件),因此您拥有一个非常简单的ReleaseStrategy-(group) -> group.size() == 2CorrelationStrategy可以基于FileHeaders.FILENAME标头,该标头在File生成之后与FileReadingMessageSource有效负载一起出现。该功能逻辑可能是这样的:

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