2012-02-16 23 views
0

我試圖完成觸發石英工作,不知怎麼綁定工作外包給特定用戶或會話中獲取後臺操作的狀態(石英工作嗎?),並有檢查的狀態的能力工作。如何在Grails的

基本上我需要在每次用戶登錄時觸發一個作業。該作業下載特定於該用戶的信息 - 可能需要幾分鐘時間,並且這些作業中的很多可能會異步觸發以供多個用戶登錄與此同時。

現在的事情是,在作業運行時,用戶可以在網站上訪問不同的頁面 - 也就是說,我不想打斷他們,所以我需要一種方法來觸發任務,但是首先檢查是否有一個特定用戶正在運行。我還需要在作業完成後更新UI。

我在這裏的損失就是那種..我找不到太多的谷歌,所以我真的很感激任何見解。

回答

0

退房的Executor Plugin。它增加了一個callAsync()元方法對你的Grails文物,它會返回一個Java對象Future,使你可以檢索的狀態和你的異步調用的結果。

如果您還需要Quartz的調度功能,只需將您的邏輯放入Grails服務中,並根據具體情況從Quartz作業或callAsync()調用Service方法即可。

+0

謝謝,檢查出來。如果必須通過ajax檢查狀態,我可以如何處理Future對象 - 當callAsync在後臺運行時,我必須檢查多個請求的狀態。 – RyanLynch 2012-02-17 02:12:22

+0

您可以嘗試將其存儲在會話的標準位置,並檢查其是否存在以及其isDone()方法的狀態,以確定您的工作進度。 – schmolly159 2012-02-17 17:38:45

0

我只能提供一個建議。我不確定爲什麼每次用戶登錄時如何觸發一個作業。對於這一點,所有你需要做的就是把所有的代碼都在工作變成一個服務,在登錄控制器,你還可以撥打服務號碼時在

用戶登錄在作業類:

class EmailAlertJob { 

    def utilService 
    static triggers = { 
     cron name: 'emailCronTrigger', cronExpression: "0 15 1 ? * SUN-SAT" 
    } 
    def execute() { 
     def send= utilService.sendEmail() 
    } 
} 

在控制器:

def userLogsIn = { 
    utilService.sendEmail() 
} 

至於跟蹤如果作業正在運行,有幾種方法可以做到這一點,如保持一個標誌特定於用戶,並在運行之前檢查標誌工作。