2011-10-13 55 views
0

如果我有一個帶有郵件服務器入站通道的Spring應用程序,處理每個電子郵件中每個文件的最佳方式是什麼(我每隔大約1分鐘輪詢一次,並獲取1個電子郵件與多個附件)。異步處理電子郵件中的附件(Spring郵件集成)

儘管我可以在接收通道(SimpleAsyncTaskExecutor或ThreadPoolTask​​Executor)上應用多線程,但這並沒有多大幫助,因爲如果我在電子郵件中附加了10個文件,則它們的處理幾乎與一個線程綁定。

直到現在,我一直保持這種非常同步的狀態,因爲我想爲每封電子郵件彙總一些數據,並在所有文件處理完畢後發送響應。我相信這也可以以更好的方式完成。

一般來說,我怎樣才能異步處理每封電子郵件中的每個文件,然後再次異步構建電子郵件回覆?

+0

問題是什麼? – Ralph

+0

我認爲標題已經足夠清晰了,但無論如何,我在問題格式中添加了相同的東西:) – user802232

+0

形成問題的句子應該以'?'結尾 - 但現在我(並且非常可愛地)瞭解你所要求的。 – Ralph

回答

1

看起來您在詢問java.util.concurrent.Future。這是一個java核心概念,直到計算(方法)結果爲止。 (以JavaDoc爲例)

該彈簧@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/