异步处理电子邮件中的附件(Spring Mail Integration)

时间:2011-10-13 10:17:55

标签: android spring email android-asynctask spring-integration

如果我有一个带有邮件服务器入站通道的Spring应用程序,那么处理每封电子邮件中每个文件的最佳方法是什么(我每隔1分钟轮询一次,并获取包含多个附件的1封电子邮件)。

虽然我可以在接收通道(SimpleAsyncTaskExecutor或ThreadPoolTask​​Executor)中应用多线程,但这没有多大帮助,因为如果我在电子邮件中附加了10个文件,那么它们的处理几乎绑定到一个线程。

到目前为止,我一直保持这种非常同步,因为我想为每封电子邮件聚合一些数据,并在处理完所有文件后发送响应。我相信这也可以更好的方式完成。

一般情况下,我如何异步处理每封电子邮件中的每个文件,然后再次异步构建电子邮件回复?

1 个答案:

答案 0 :(得分:1)

看起来你要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/