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



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

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

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

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

看起来你要的是java.util.concurrent.Future。这是java的核心概念,直到(方法)结果被计算出来。(参见JavaDoc的例子)

Spring @Async也支持Future概念。

因此,您唯一需要做的是使用@Async的方法,该方法将邮件的一个附件作为参数并返回将来计算的内容。您需要为所有附件(异步)调用所有这些方法,并将立即返回的future存储在一个列表中。在调用所有方法之后。你试着在一个新的循环中得到特征结果。循环结束后,所有附件都异步进行。

 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/

最新更新