如果我有一个带有邮件服务器入站通道的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/