0

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

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

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

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

4

1 回答 1

1

看起来你在要求java.util.concurrent.Future. 这是一个 java 核心概念,直到计算出(方法)结果。(有关示例,请参阅JavaDoc )

Spring也@Async支持这个Future概念。

因此,您需要做的唯一想法是使用一种方法,该方法使用@AsyncMail 的一个附件作为参数并返回将来计算的内容。您需要为所有附件(异步)调用所有这些方法,并将立即返回的未来存储在列表中。在调用所有方法之后。您尝试在新循环中获取功能结果。此循环完成后,所有附件都将异步进行。

 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 回答