2011-12-29 45 views
0

我的Grails 1.3.7應用程序需要處理大的XML文件,所以我有一個控制器,我上傳了大文件,然後我將這個文件在服務器上的路徑傳遞給後臺線程,以便處理我可以立即返回控制器操作。在Grails中保留對後臺線程的引用?

現在,我使用的是Grails Executor插件,它工作正常。我有一個上傳域對象,隨着處理過程的進行而更新(當前狀態,已處理元素的數量等)。但現在我有2個要求:

  • 當應用程序崩潰或服務器關機,我想攔截和更新我上傳域說,過程被中斷
  • 我希望用戶可以點擊一個鏈接時,中斷處理自己和可能來自控制器動作恢復它

有沒有辦法,我能堅持一提到我的後臺任務,並與攔截框架的java.util.concurrent任何中斷(一種方式由Executor插件使用)?

如果我不能用util.concurrent做,它可以與其他插件/框架?例如,我看了一下Quartz,但我不明白該怎麼做。

回答

2

我討厭回答沒有完全測試它,但grails-executor plugin docs表示callAsync方法返回java.util.concurrent.Future object

這個對象可以用來做兩件事情:

  1. 確定一個過程已完成或已取消。
  2. 取消正在運行的過程(如果需要,甚至中斷)。

從理論上講,你應該能夠在用戶的會話中保存這個Future。然後,您可以稍後檢索並根據需要使用它來檢查狀態和/或取消過程。

喜歡的東西:

session.backgroundProcess = callAsync{...} 

// later 
def bgProc = session.backgroundProcess 
if(bgProc && !(bgProc.done || bgProc.cancelled)) { 
    // process is still running 
} 

這只是想法,這不是測試。我也不知道是否有問題導致內存泄漏。一旦過程完成,您需要確保您分離Future