У меня есть требование прочитать файлы из исходного каталога и последовательно его обрабатывать (один за другим).Как обрабатывать файл последовательно с помощью адаптера входящего трафика Spring Integration.
У меня есть ниже конфигурации контекста приложения,
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:int="http://www.springframework.org/schema/integration"
xmlns:file="http://www.springframework.org/schema/integration/file"
xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/integration
http://www.springframework.org/schema/integration/spring-integration.xsd
http://www.springframework.org/schema/integration/file
http://www.springframework.org/schema/integration/file/spring-integration-file.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<int:channel id="controlChannel" />
<int:channel id="adapterInputChanel">
<int:queue />
</int:channel>
<int:control-bus input-channel="controlChannel" />
<file:inbound-channel-adapter id="inboundAdapter"
directory="inputdir"
channel="adapterInputChanel" auto-startup="false" prevent-duplicates="true"
ignore-hidden="true">
<int:poller id="poller" fixed-delay="5000"
max-messages-per-poll="1">
</int:poller>
</file:inbound-channel-adapter>
<int:service-activator input-channel="adapterInputChanel"
ref="mainService" method="readFiles" output-channel="filesOut">
<int:poller fixed-delay="500" />
</int:service-activator>
<bean id="mainService" class="com.sample.MainService">
</bean>
<file:outbound-channel-adapter id="filesOut"
directory="output dir" />
</beans>
В соответствии с выше конфигурации, файл въездного адаптер получит один файл для каждого опроса и выполнения исполнителем услуг.
Но если система получает другой файл, тогда входящий адаптер файла не должен запускать службу еще до завершения первой транзакции.
Пожалуйста, дайте мне знать, как справиться с этой проблемой с некоторыми образцами.
Спасибо. Это сработало. Я использую управляющую шину для запуска/остановки этого процесса опроса, как показано ниже: controlChannel = ac.getBean ("controlChannel", MessageChannel.class); SubscribableChannel adapterInputChanel = ac.getBean ("adapterInputChanel", SubscribableChannel.class); controlChannel.send (новый GenericMessage ("@ inboundAdapter.start()")); Но проблема в том, что если я остановлю адаптер, соответствующий сервис немедленно прекратится. В этом случае входной адаптер файла должен только остановить дальнейший опрос. Не могли бы вы посоветовать мне об этом. –
dave
Остановка адаптера не повлияет на текущий поток, если только он не делает что-то прерывистое. Если это так, вы можете использовать [smart poller] (http://docs.spring.io/spring-integration/reference/html/messaging-channels-section.html#__smart_polling), чтобы отложить остановку - используйте шину управления отправить сообщение своему поллеру, чтобы сообщить об этом, чтобы остановить адаптер, когда опрос возвращает «null» (или до следующего опроса, в зависимости от ваших требований). –