2

Grails2.1アプリケーションにQuartzプラグインをインストールしました。5分ごとに、いくつかの数値を計算する1つのジョブがトリガーされます。番号はすべてのページのサイドバーに表示されています。計算結果は頻繁に変更されます。私の目標は、ユーザーが画面を更新したときに、サイドバーに新しい結果が表示されるようにすることです。今のところ私のアプローチは、ajax呼び出しをコントローラーに送信し、データベースから結果を取得して画面にレンダリングすることです。

ユーザーがリンクをクリックしたり画面を更新したりするたびにクエリを実行せずにビューがそれらを使用できるように、データベース以外の場所にJOBからの計算結果を保存(キャッシュ)する方法はありますか?

私はセッションについて考えましたが、通常のWebリクエスト以外でそれが可能であるか、それとも良い解決策であるかはまったくわかりませんでした。解決策や代替アプローチはありますか?ありがとう

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
    }
}
4

2 に答える 2

4

Grailsのサービスはデフォルトでシングルトンであるため、calculatorServiceQuartzジョブでアクセスされるのは、calculatorServiceそれが配線されている他のクラス(コントローラーなど)でアクセスされるのと同じです。

内のクラスレベルで値を格納しcalculatorService、コントローラーがデータを取得するためのアクセサーメソッドを追加するだけです。

class CalculatorService {

    ConcurrentHashMap cache = [:]

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

    def retrieveCalculation(String key) {
        cache[(key)]
    }
}
于 2012-09-07T20:00:05.933 に答える
0

を使用できますgrailsApplication。仕事に注入grailsApplicationして、割り当てで値を保存するだけですgrailsApplication.config.calcResults = calculatorService.runCalculators

ジョブを初めて実行する前に値を使用できるように、grailsApplication.config.calcResults値も初期化することをお勧めします。Bootstrap.groovy

于 2012-09-07T17:28:40.643 に答える