2017-02-21 9 views
0

ソースディレクトリからファイルを読み込み、順番に(1つずつ)処理する必要があります。私は、インバウンド・アダプタファイル、設定上のあたりのようSpring統合ファイルインバウンドアダプタを使用してファイルを順番に処理する方法

<?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);サブタイプ: controlChannel.send(新しいGenericMessage ( "@ inboundAdapter.start()")); しかし、問題は、私はアダプタを停止すると、それぞれのサービスがすぐに終了しています。この場合、ファイルインバウンドアダプタはそれ以降のポーリングを停止するだけです。これについて私に助言してください。 – dave

+0

アダプタを停止しても、割り込みが発生しない限り、現在のスレッドには影響しません。そうであれば、[smart poller](http://docs.spring.io/spring-integration/reference/html/messaging-channels-section.html#__smart_polling)を使用して停止を延期することができます - コントロールバスを使用しますポーリングが 'null 'を返すとき(またはあなたの要求に応じて次のポーリングの前に)アダプターを停止するようにポーラーにメッセージを送信することができます。 –

関連する問題