Проверка данных файла перед перемещением в целевую систему

#spring #spring-boot #spring-integration #spring-integration-aws

#spring #весенняя загрузка #spring-интеграция #spring-интеграция-aws

Вопрос:

Я хочу проверить данные (для поддержания целостности данных) внутри файла, используя некоторую логику перед отправкой в целевую систему. Для этого я использую файлы и логику файлов с контрольной суммой, подобную этой, abc.txt является исходным файлом abc.txt.контрольная сумма — это файл контрольной суммы этого файла. abc.txt.checksum — это хэш abc.txt файл и будет использоваться для проверки перед отправкой в целевую систему.Оба файла будут находиться в одном и том же исходном расположении. У меня есть условие фильтра, чтобы не выбирать файл .checksum во время опроса, поскольку я не хочу отправлять файл .checksum в целевую систему. Один раз abc.txt файл выбран, я использую одну Java-логику для создания хэша этого файла внутри и сохранения его в памяти, и его необходимо сравнить с контрольной суммой (abc.txt.checksum) данных, которые уже есть в этом месте. Если обе контрольные суммы совпадают, то в целевую систему необходимо переместить только исходный файл, иначе он не должен обрабатываться и выдает ошибку. Может кто-нибудь, пожалуйста, подскажите мне, как этого добиться? или как я получу файлы .checksum (abc.txt.checksum), поскольку они всегда будут находиться в исходном местоположении?

Ответ №1:

То, что вы объясняете, полностью соответствует логике aggregator компонента.

Вы проводите опрос для всех файлов в каталоге, группируете их по префиксу имени файла. Это можно сделать с помощью выражения SpEL для заголовка correlationKey против FileHeaders.FILENAME сообщения. Таким образом 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", "")
 

Комментарии:

1. Спасибо, Артем, за ваш ответ. Позвольте мне сначала попробовать, так как я еще не использовал компонент aggregator.

2. Как сделать correlationKey в этом случае?

3. Смотрите ОБНОВЛЕНИЕ в моем ответе.