2017-02-17 9 views
1

<int-sftp:inbound-streaming-channel-adapter/>はファイルのディレクトリをポーリングし、見つかったときにストリームをサービスアクティベータに渡すフローを実装しています。SpringとRedisLockRegistryとの統合例

問題は、複数のアプリケーションインスタンスが実行されているため、1つのインスタンスだけがファイルを取得できるようにプロセスをロックしたいと考えています。

ドキュメントを見ると、Redis Lock Registryは解決策に見えますが、XMLでこの例が使用されていますか?

私はそこにいくつかの参考文献とそのソースコードがあります。

http://docs.spring.io/spring-integration/reference/html/redis.htmlポイント24.1

追加情報: アイブ氏はRedisMetaDataStoreとSftpSimplePatternFileListFilterを追加しました。それは動作しますが、sftpInboundAdapterがポーラーによってアクティブにされると、メタデータストア内の各ファイルのエントリが追加されるときに、奇妙なことがあります。 10個のファイルがあるとしますが、データストアには10個のエントリがありますが、 "1 go"の10個のファイルはすべて処理されません。アダプタからのポーリングごとに1ファイルしか処理されません。 5ファイルを処理した後にファイルを取得したサーバーがダウンした場合、別のサーバーは、ファイルが「タッチ」されていない限り、残りの5ファイルを受け取りません。

ポーリングごとに1ファイルを取得する動作が正しいか、または1回のポーリング中にすべての有効なファイルを処理する必要があります。以下は

<int:channel id="sftpInbound"/> <!-- To Java --> 
<int:channel id="sftpOutbound"/> 
<int:channel id="sftpStreamTransformer"/> 

<int-sftp:inbound-streaming-channel-adapter id="sftpInboundAdapter" 
     channel="sftpInbound" 
     session-factory="sftpSessionFactory" 
     filter="compositeFilter" 
     remote-file-separator="/" 
     remote-directory="${sftp.directory}"> 
    <int:poller cron="${sftp.cron}"/> 
</int-sftp:inbound-streaming-channel-adapter> 

<int:stream-transformer input-channel="sftpStreamTransformer" output-channel="sftpOutbound"/> 

<bean id="compositeFilter" 
    class="org.springframework.integration.file.filters.CompositeFileListFilter"> 
    <constructor-arg> 
     <list> 
      <bean 
       class="org.springframework.integration.sftp.filters.SftpSimplePatternFileListFilter"> 
       <constructor-arg value="Receipt*.txt" /> 
      </bean> 
      <bean id="SftpPersistentAcceptOnceFileListFilter" class="org.springframework.integration.sftp.filters.SftpPersistentAcceptOnceFileListFilter"> 
       <constructor-arg ref="metadataStore" />     
       <constructor-arg value="ReceiptLock_" />      
      </bean> 
     </list> 
    </constructor-arg> 
</bean> 

<bean id="redisConnectionFactory" 
    class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory"> 
    <property name="port" value="${redis.port}" /> 
    <property name="password" value="${redis.password}" /> 
    <property name="hostName" value="${redis.host}" /> 
</bean> 

答えて

0

私のXMLです。ロック登録ではなく、Redis(またはその他の)メタデータストアでSftpPersistentAcceptOnceFileListFilterdocs here)を使用する必要があります。以下のコメントについて

EDIT

はい、これは既知の問題です。 next releaseでは、正確にこの理由でmax-fetch-sizeを追加しました。インスタンスは、最初にインスタンスを取得するのではなく、いくつかのファイルを取得することができます。

(インバウンドアダプタは、見つかったファイル(ストアにまだないファイル)をローカルディスクにコピーしてから、一度に1つずつ出力します。

5.0今すぐマイルストーンとしてご利用いただけますM2 at the time of writing, but the current version and milestone repo can be found here;数ヶ月間はリリースされません。

また、アウトバウンドゲートウェイを使用することもできます.1つはファイルをLSに、もう1つは個別のファイルを取得することです。あなたのアプリはメタデータストア自体を使用して、どのファイルをフェッチできるかを判断する必要があります。

+0

ありがとうございましたGary、Iveはあなたが提案したように実装しました。私はそれがほぼそこにあると思います。問題を説明する元の質問に追加情報を追加しました。 – sdiaz1000

+0

詳細については、私の答えに編集を参照してください。 –

+0

Iveはちょうどそれを働かせましたpollerにmax-messages-per-poll属性を加えて10に設定しました。ありがとう。 – sdiaz1000

関連する問題