2012-06-07 76 views
1

異步作業,例如從網站下載分數,或在完成一些關鍵任務後發送電子郵件。 當我們下載一些分數時,我們必須等待當前頁面獲取響應頁面或獲取文件下載。 是否有可能我可以點擊下載分數,它發生在後臺,以便我可以導航到網站的其他部分 ,並在同一時間檢查工作狀態。或者在將來稍後安排一些工作,並通過電子郵件獲得其執行結果 。Java中的異步任務Web應用程序

Ours是一個帶Hibernate 3.5 ORM的struts 2 web應用程序。瀏覽到一些java調度庫後,在Quartz上獲得了一些信息。 但是Quartz是否適合上述要求或我可以嘗試的任何其他庫? 請指導我在正確的方向。

+0

有沒有問題.... – Th0rndike

回答

7

您將需要某種異步處理支持。您可以使用:

  • - 此庫非常全面,可以讓您安排各種作業。如果你想使用它只是在後臺調度作業的目的,並立即運行它們,可能是矯枉過正

  • 使用線程池,見Executors

  • 隊列可以請求聽和異步處理他們 S的@Async/@Asynchronous支持

  • 最後,你可以充分利用

然後你mut以某種方式恢復結果。Depening你是否要直接在瀏覽器或通過電子郵件解救他們

  • 每次

    你呈現頁面,檢查是否沒有任何已完成/正在進行的作業。如果有一些完成的作業,在頁面上顯示一個額外的鏈接(通知類型)。如果作業正在進行中,啓動請求,並要求每隔一秒或使用長輪詢/ 要接收結果立即

  • ,如果你想通過電子郵件發送的結果,只是在作業完成後發送飾面。更簡單但不太友好的恕我直言。

+0

感謝您的詳細回覆。正如前面提到的Quart-Scheduler一樣,這個庫是關於在後臺運行一個預定的作業,它是否允許用戶交互(按鈕點擊或鏈接)類型運行作業? Threadpool(executors)也是一種替代解決方案嗎? –

+0

通過與用戶交互運行作業,您的意思是什麼?你可以開始一個用戶操作的工作,比如點擊按鈕,但是這個工作在後臺運行,你無法控制它。 Quartz使用下面的線程池,所以如果你需要輕量級的東西,直接使用線程池。 –

+0

所以直接使用線程池就足以在後臺添加作業並執行,並且可以中間獲取作業狀態。並在工作完成後發送電子郵件/或網站上的彈出窗口。 –

1

石英確實是這樣做的一種方式 - 如果您想要安排工作在特定時間或特定頻率下運行,則工作得很好。

如果你只是想踢東西掉在後臺響應用戶操作,並檢查其狀態,也有一些其他的方法來做到這一點可能更適合這種模式:

  • java.util.concurrent包:您可以設置一個ThreadPoolExecutor並向其提交執行Callable的任務。您可以返回一個Future<T>對象,您可以檢查完成(isDone)並在完成時得到結果(get)。

  • 與EJB或Spring,還有一個(會話)bean方法是@Async@Asynchronous,其返回一個Future<T>,以及和與上述行爲的概念。基本上,這只是從代碼中抽象出線程池的創建和管理,並將其移入容器或框架中。