S3PersistentAcceptOnceFileListFilter создает сообщения для существующих / синхронизированных файлов при перезапуске приложения

кто-нибудь сталкивался с этим? в основном я стремлюсь обработать файл один раз, даже если приложение отклонено

@Bean
public S3InboundFileSynchronizer s3InboundFileSynchronizer() throws Exception {
    S3InboundFileSynchronizer synchronizer = new S3InboundFileSynchronizer(amazonS3());
    synchronizer.setDeleteRemoteFiles(false);
    synchronizer.setPreserveTimestamp(true);
    synchronizer.setRemoteDirectory(sourceBucket + "/dir/");
    synchronizer.setFilter(new S3PersistentAcceptOnceFileListFilter(new SimpleMetadataStore(), "simpleMetadataStore"));
    return synchronizer;
}

private AmazonS3 amazonS3() throws Exception {      
    return clientFactory.getClient(AmazonS3.class);
}

@Bean
@InboundChannelAdapter(value = "s3FilesChannel", poller = @Poller(fixedDelay = "5000"))
public S3InboundFileSynchronizingMessageSource s3InboundFileSynchronizingMessageSource() throws Exception {
    S3InboundFileSynchronizingMessageSource messageSource =
            new S3InboundFileSynchronizingMessageSource(s3InboundFileSynchronizer());
    messageSource.setAutoCreateLocalDirectory(true);
    messageSource.setLocalDirectory(new File("c:/temp/"));
    messageSource.setLocalFilter(new FileSystemPersistentAcceptOnceFileListFilter(new SimpleMetadataStore(), "fsSimpleMetadataStore"));             
    return messageSource;
}
1
0
141
1

Ответы 1

Ваша проблема в том, что вы используете SimpleMetadataStore в памяти, поэтому после перезапуска приложения вы теряете всю информацию, хранящуюся там.

Вместо этого рассмотрите возможность использования некоторой реализации постоянного хранилища, например для AWS у нас есть DynamoDbMetadataStore: https://github.com/spring-projects/spring-integration-aws#metadata-store-for-amazon-dynamodb

есть ли какое-либо простое хранилище метаданных, использующее файловую систему для сохранения?

ali 03.10.2018 18:03

Да, PropertiesPersistingMetadataStore: docs.spring.io/spring-integration/docs/5.0.8.RELEASE/referen‌ ce /…

Artem Bilan 03.10.2018 18:05

Большой! Давайте тогда рассмотрим это: stackoverflow.com/help/someone-answers!

Artem Bilan 03.10.2018 18:11

по-прежнему не работает с PropertiesPersistingMetadataStore, он выдает сообщение при запуске для уже загруженного файла, а также обнаруживает, что журналы "не были перенесены в существующий локальный файл 'c: \ temp \ a \ b \ file.xml' . Рассмотрите возможность удаления локального файла "

ali 04.10.2018 11:40

Вам нужно очистить этот локальный каталог

Artem Bilan 04.10.2018 13:07

Перед запуском ваших тестов

Artem Bilan 04.10.2018 13:07

Может быть, я неправильно понимаю, как это работает: для уже загруженной записи я не ожидаю появления какого-либо сообщения Итак, журнал имеет смысл, но почему он выдает сообщение, которого я не получаю Если я пойду и почищу локальный каталог, я ожидаю, что это чтобы загрузить файл снова и создать сообщение для следующего канала (что он и делает). Я что-то здесь упустил?

ali 04.10.2018 13:22

Если файл находится в локальном каталоге, то загруженная запись игнорируется, но для этой записи по-прежнему создается сообщение. Чтобы избежать этого, вам необходимо иметь упомянутый выше фильтр списка файлов.

Artem Bilan 04.10.2018 13:33

Другие вопросы по теме