<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>
ありがとうございましたGary、Iveはあなたが提案したように実装しました。私はそれがほぼそこにあると思います。問題を説明する元の質問に追加情報を追加しました。 – sdiaz1000
詳細については、私の答えに編集を参照してください。 –
Iveはちょうどそれを働かせましたpollerにmax-messages-per-poll属性を加えて10に設定しました。ありがとう。 – sdiaz1000