Мой сценарий заключается в переносе одного файла из корзины AWS S3 в экземпляр EC2 только один раз, когда файл изменяется.Я использовал следующую конфигурацию и вручную запустил адаптер при запуске сервера.
Проблема заключается в том, что при запуске сервера выполнение повторяется 5 или 6 раз.Похоже, что выполняются разные потоки.Я могу видеть другого исполнителя задач в журнале, не знаю, является ли это проблемой поллера или адаптера.
Я использую активатор службы для выполнения какой-либо другой операции, основанной на изменении файла в местоположении S3.
Примечание. Эта проблема возникает только один раз при запуске.Он работает нормально, дальнейшее изменение файла.
Конфиг:
<bean id="s3SessionFactory"
class="org.springframework.integration.aws.support.S3SessionFactory"></bean>
<bean id="acceptOnceFilter"
class="org.springframework.integration.file.filters.AcceptOnceFileListFilter" />
<task:executor id="s3PollingExecutor" pool-size="1" queue-capacity="10" />
<integration:channel id="s3FilesChannel"/>
<int-aws:s3-inbound-channel-adapter id="s3FileInbound"
channel="s3FilesChannel"
session-factory="s3SessionFactory"
auto-create-local-directory="false"
delete-remote-files="false"
preserve-timestamp="true"
filter="acceptOnceFilter"
local-directory="local_directory"
auto-startup="false"
remote-directory="s3_bucket">
<integration:poller id="s3FilesChannelPoller"
fixed-rate="1000"
max-messages-per-poll="1" time-unit="MILLISECONDS"
task-executor="s3PollingExecutor">
</integration:poller>
</int-aws:s3-inbound-channel-adapter>
<integration:service-activator id="s3FilesChannelWatcher"
input-channel="s3FilesChannel"
output-channel="nullChannel"
ref="configurationFileWatcher"
method="getConfigurationFileWatcher">
</integration:service-activator>
Как вы и предполагали, я попробовал следующее.
<bean id="acceptOnceFilterRegion"
class="cS3FileFilterOnLastModifiedTime">
<constructor-arg index="0" ref="metaDataStoreRegion"/>
<constructor-arg index="1" value="*"/>
</bean>
логика добавлена для проверки последнейвремя модификации
import org.springframework.integration.aws.support.filters.S3PersistentAcceptOnceFileListFilter;
import org.springframework.integration.metadata.ConcurrentMetadataStore;
import com.amazonaws.services.s3.model.S3ObjectSummary;
public class S3FileFilterOnLastModifiedTime extends S3PersistentAcceptOnceFileListFilter {
Long delayTime = 1000L;
public S3FileFilterOnLastModifiedTime(ConcurrentMetadataStore store, String prefix) {
super(store, prefix);
}
@Override
public boolean accept(S3ObjectSummary file) {
long lastModified = modified(file);
long currentTime = System.currentTimeMillis();
long timeDifference = currentTime - lastModified;
return timeDifference > delayTime;
}
}
Все еще нет надежды. Журналы похожи на это .......
[INFO ] 2018-10-11 11:22:10,888 [s3PollingExecutor-1] ConfigurationSettingWatcher {} - ConfigurationSettingWatcher Started succesfully
[INFO ] 2018-10-11 11:22:10,892 [s3PollingExecutor-2] ConfigurationSettingWatcher {} - ConfigurationSettingWatcher Started succesfully
[INFO ] 2018-10-11 11:22:10,892 [s3PollingExecutor-3] ConfigurationSettingWatcher {} - ConfigurationSettingWatcher Started succesfully
[INFO ] 2018-10-11 11:22:10,893 [s3PollingExecutor-4] ConfigurationSettingWatcher {} - ConfigurationSettingWatcher Started succesfully
[INFO ] 2018-10-11 11:22:10,893 [s3PollingExecutor-5] ConfigurationSettingWatcher {} - ConfigurationSettingWatcher Started succesfully
[INFO ] 2018-10-11 11:22:10,894 [s3PollingExecutor-6] ConfigurationSettingWatcher {} - ConfigurationSettingWatcher Started succesfully