2012-09-07 76 views
1

我在我的Grails 2.1應用程序安裝石英插件。每5分鐘觸發一次工作,計算一些數字。數字顯示在每個頁面的側欄上。計算結果會經常更改,我的目標是當用戶刷新屏幕時,他們可以在側邊欄上看到新的結果。 現在我的做法是Ajax調用發送到控制器,並從數據庫中抓取的結果,並使其在屏幕上。如何在會話中存儲石英工作的結果?

有什麼辦法來存儲(緩存)計算結果從作業的地方比其他數據庫,這樣我的看法可以不執行查詢每次用戶點擊一個鏈接或刷新屏幕使用它們?

我想到了會議,但不知道它甚至有可能正常的網絡請求或它的一個很好的解決方案,在所有的外面。有沒有解決方案或替代方法? 感謝

class MonitoringJob { 
    def calculatorService 
    def name = 'Monitoring' 
    def group = 'ApplicationGroup' 
    static triggers = { 
     simple name: 'mySimpleTrigger', startDelay: 60000, repeatInterval: 30000 
    } 

    def execute() { 
     def results = calculatorService.runCalculators() 
      //something like this: session.results =result 
    } 
} 

回答

3

Grails中的服務默認爲單身人士,因此在Quartz作業中訪問的calculatorService將與在其中連接的其他類(例如控制器)中訪問的calculatorService相同。

只是存儲在類級別的值你calculatorService內,並添加控制器檢索數據的存取方法。

class CalculatorService { 

    ConcurrentHashMap cache = [:] 

    def runCalculators() { 
     // Do calculations 
     cache.result1 = calculatedResult1 
     // etc... 
    } 

    def retrieveCalculation(String key) { 
     cache[(key)] 
    } 
} 
+0

非常感謝,工作得很好。 – Alidad

0

您可以使用grailsApplication。剛剛注入grailsApplication到你的工作,然後保存值與分配grailsApplication.config.calcResults = calculatorService.runCalculators

您可能希望在Bootstrap.groovy初始化grailsApplication.config.calcResults價值,以及因此它的可用工作首次運行前。

+0

誰低估了這個答案是否關心解釋他們的反對意見? – proflux