これは以前の質問Spring Integration File readingの続きです。 要約すると、fileInチャネル(Queue)を持っていて、そのファイルを処理するServiceActivatorとファイルを保存するOutbound-Adapterがあります。Spring統合ServiceActivatorsの同時実行性
メッセージを複数のスレッドで処理するために並行処理を導入したいと考えました。私はJava DSLを使用しています(ただしJava8は使用しません)。私は次のようにしてそれを行うことができました...
@Bean
public MessageChannel fileInChannel() {
return MessageChannels.queue("fileIn").get();
}
@Bean
public IntegrationFlow fileProcessingFlow() {
return IntegrationFlows.from(fileInChannel())
.handle(myFileProcessor, "processFile",
new Consumer<GenericEndpointSpec<ServiceActivatingHandler>>() {
@Override
public void accept(GenericEndpointSpec<ServiceActivatingHandler> t) {
t.poller(Pollers.fixedRate(100).maxMessagesPerPoll(1).taskExecutor(Executors.newCachedThreadPool()));
}
})
.handle(Files.outboundAdapter(new File(outDir)).autoCreateDirectory(true).get())
.get();
}
これは機能しました!私も次のように試しました
public IntegrationFlow fileProcessingFlow() {
return IntegrationFlows.from(fileInChannel())
.channel(MessageChannels.executor(Executors.newCachedThreadPool()))
.handle(myFileProcessor)
.handle(Files.outboundAdapter(new File(outDir)).autoCreateDirectory(true).get())
.get();
}
これも機能しました!私はそれがちょうどスタイルであるかどうかわからない、または1つのアプローチが他よりも優れている。もしそうなら、どちらのアプローチが良いでしょう。
第2に、上記の場合、「ファイル書き込み」(すなわち最後のステップ)が連続しているか、それは異なるスレッドで動作しますか?並行処理が必要な場合は、ハンドル(fileProcessor)とハンドル(outBoundAdapter)の間に別のtaskExecutorチャネルを導入する必要がありますか? 最終的には、outboundadapterはリモートファイルS3アダプターになります。したがって、質問