2

我已经在我的 Grails 2.1 应用程序中安装了 Quartz 插件。每 5 分钟触发一项计算一些数字的作业。数字显示在每一页的侧边栏上。计算结果会经常变化,我的目标是当用户刷新屏幕时,他们可以在侧边栏看到新结果。现在我的方法是将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 中的服务默认是单例的,因此calculatorService在 Quartz 作业中访问的服务将与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 回答