2017-02-21 11 views
0

У меня есть требование прочитать файлы из исходного каталога и последовательно его обрабатывать (один за другим).Как обрабатывать файл последовательно с помощью адаптера входящего трафика 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> 

В соответствии с выше конфигурации, файл въездного адаптер получит один файл для каждого опроса и выполнения исполнителем услуг.

Но если система получает другой файл, тогда входящий адаптер файла не должен запускать службу еще до завершения первой транзакции.

Пожалуйста, дайте мне знать, как справиться с этой проблемой с некоторыми образцами.

ответ

0

Снимите <queue/> с adapterInputChanel и снимите <poller/> с сервисного активатора.

Тогда канал будет DirectChannel, и ваша служба будет работать в потоке опроса адаптера, и следующий файл не будет обработан до тех пор, пока служба не выйдет.

Вы можете прочитать о different channel types here; в частности, разницу между подписчиками и источниками загрязнения.

+0

Спасибо. Это сработало. Я использую управляющую шину для запуска/остановки этого процесса опроса, как показано ниже: controlChannel = ac.getBean ("controlChannel", MessageChannel.class); SubscribableChannel adapterInputChanel = ac.getBean ("adapterInputChanel", SubscribableChannel.class); controlChannel.send (новый GenericMessage ("@ inboundAdapter.start()")); Но проблема в том, что если я остановлю адаптер, соответствующий сервис немедленно прекратится. В этом случае входной адаптер файла должен только остановить дальнейший опрос. Не могли бы вы посоветовать мне об этом. – dave

+0

Остановка адаптера не повлияет на текущий поток, если только он не делает что-то прерывистое. Если это так, вы можете использовать [smart poller] (http://docs.spring.io/spring-integration/reference/html/messaging-channels-section.html#__smart_polling), чтобы отложить остановку - используйте шину управления отправить сообщение своему поллеру, чтобы сообщить об этом, чтобы остановить адаптер, когда опрос возвращает «null» (или до следующего опроса, в зависимости от ваших требований). –

Смежные вопросы