2016-11-25 15 views
1

これは以前の質問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アダプターになります。したがって、質問

答えて

0

私は2番目を好む傾向がありますが、それは単なるスタイルです。ファイルアダプタはスレッドセーフです。

一般に、書き込みは並行して行われます。

唯一の例外は、FileExistsMode.APPENDを使用して書き込みを行っている場合です。この場合、書き込み中にロックが保持され、ファイル名が同じロック(256個のロックがあります)最初の完了時に実行されます。

関連する問題