0

メール サーバーのインバウンド チャネルを備えた Spring アプリを使用している場合、すべてのメールのすべてのファイルを処理する最良の方法は何ですか (約 1 分ごとにポーリングし、複数の添付ファイルを含む 1 つのメールをフェッチします)。

受信チャネル (SimpleAsyncTaskExecutor または ThreadPoolTask​​Executor) でマルチスレッドを適用できますが、メールに 10 個のファイルが添付されている場合、それらの処理はほぼ 1 つのスレッドにバインドされるため、これはあまり役に立ちません。

すべてのメールのデータを集計し、すべてのファイルが処理された後に応答を送信したかったので、これまでかなり同期してきました。これももっと良い方法でできると思います。

一般に、すべての電子メールのすべてのファイルを非同期で処理し、再び非同期で電子メールの返信を作成するにはどうすればよいですか?

4

1 に答える 1

1

を求めているようですjava.util.concurrent.Future。これは、(メソッド) の結果が計算されるまでブロックする Java コアの概念です。(例についてはJavaDocを参照してください)

スプリングもコンセプト@Asyncをサポートしています。Future

したがって、必要な唯一のことは@Async、引数としてメールの添付ファイルを 1 つ取り、将来計算されたものを返すメソッドを使用することです。すべての添付ファイル (非同期) に対してこのすべてのメソッドを呼び出し、すぐに返された未来をリストに格納する必要があります。すべてのメソッドが呼び出された後。新しいループでフィーチャの結果を取得しようとしました。このループが終了すると、すべての添付ファイルが非同期で処理されます。

 processOneMail(List<Attachement> attachments) {
      List<Future<AttachmentResult>> futures = new ArrayList...

      for(Attachment attachment : attachments) {
        futures.add(processOneAttachment(attachment)); //async
      }

      List<AttachmentResult> attachmentResults = new ArrayList...
      for(Future<AttachmentResult>> future : futures) {
         attachmentResults.add(future.get()); //eventually blocks
      }
      //now all attachments are calculated and stored in the list.      
      ...
    }
@Async
Future<AttachmentResult> processOneAttachment(Attachment attachment) {
   ...
}

参照: http://blog.espenberntsen.net/2010/03/08/spring-asynchronous-support/

于 2011-10-13T12:27:28.280 に答える