2012-09-10 74 views
1

我有一個關於石英和服務類內運行線程的問題。Grails石英和線內服務

我得到我以前的問題回答:Grails background process,但我有另一個問題。

設置:我有一個設置爲運行服務的作業,它的工作原理完美。然而,在一個Service類中,我有一個可以並行運行的算法。

問題:通常我會設置代碼並行在下面很簡單的方式運行:

Item.each { 
    Thread.start { 
     do some calculations here  
     write to DB 
    } 
} 

然而,由於我的代碼需要寫入數據庫,我需要利用域類和那點我的代碼剎車。 Hibernate抱怨線程無法訪問某些東西。

我不確定爲什麼我不能使用Service類中的線程並利用域類。有人可以幫助我解決這個難題嗎? 我是否需要以特殊方式創建線程?可能我不應該在Service類中創建線程(因爲Service類似乎在線程內運行)?我是否需要將我的代碼移到Job類中?

請幫忙。

謝謝。

+0

嘗試在看看執行人插件和包裹呼叫與服務:runAsync {service.serviceMethod()} – Steve

+0

進一步什麼@Steve說,在默認情況下,新的線程*不*有一個Hibernate會話連接(這是需要使用休眠) - 因此你看到的錯誤。執行器插件管理你的連接休眠會話(事實上,石英插件也是如此)。 –

回答

1

默認情況下,新線程沒有綁定到它們的Hibernate Session。要附加一個Hibernate會話,請嘗試以下操作:

Item.each { 
    Thread.start { 
     Item.withTransaction { 
      do some calculations here  
      write to DB 
     } 
    } 
} 

你也可以考慮GPars了一個易於使用的並行架構。

+0

似乎很好地工作。謝謝。 – MeIr