Асинхронная обработка вложенных файлов в письме (Spring Mail Integration) - PullRequest
0 голосов
/ 13 октября 2011

Если у меня есть приложение Spring с входящим каналом почтового сервера, как лучше всего обрабатывать каждый файл в каждом письме (я опрашиваю примерно каждые 1 минуту и ​​получаю 1 письмо с несколькими вложениями).

Хотя я могу применить многопоточность на принимающем канале (SimpleAsyncTaskExecutor или ThreadPoolTaskExecutor), это не очень помогает, потому что если у меня есть 10 файлов, вложенных в электронное письмо, их обработка в значительной степени связана с одним потоком.

Я держал это довольно синхронно до сих пор, потому что я хотел объединить некоторые данные для каждого электронного письма и отправить ответ после того, как все файлы были обработаны.Я считаю, что это также может быть сделано лучше.

В общем, как я могу асинхронно обрабатывать каждый файл в каждом письме, а затем снова асинхронно создавать ответ по электронной почте?

1 Ответ

1 голос
/ 13 октября 2011

Похоже, вы просите java.util.concurrent.Future.Это базовая концепция Java, которую нужно блокировать, пока не будет вычислен результат (метода).(см. JavaDoc для примера)

Spring @Async также поддерживает концепцию Future.

Так что единственное, что вам нужноДля этого нужно иметь метод, который использует @Async, принимает в качестве аргумента одно вложение Mail и возвращает то, что когда-либо будет рассчитано в будущем.Вам нужно вызвать все эти методы для всех вложений (асинхронных) и сохранить сразу возвращенное будущее в списке.После того, как все методы вызваны.Вы пытаетесь получить результаты функции в новом цикле.После завершения этого цикла все вложения выполняются асинхронно.

 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/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...