如何在会话中存储石英作业的结果?

时间:2012-09-07 13:26:23

标签: grails quartz-scheduler grails-2.0

我在Grails 2.1应用程序中安装了Quartz插件。每5分钟触发一个工作,计算一些数字。这些数字显示在每页的侧栏上。计算结果会经常变化,我的目标是当用户刷新屏幕时,他们可以在侧边栏上看到新结果。 现在我的方法是将ajax调用发送到控制器并从数据库中获取结果并在屏幕上呈现它。

有没有办法在JOB以外的某个地方存储(缓存)JOB的计算结果,以便每次用户点击链接或刷新屏幕时我的视图都可以使用它们而不执行查询?

我考虑过会议,但不确定它是否可能超出正常的网络请求或者它是一个很好的解决方案。有没有解决方案或替代方法? 谢谢

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

2 个答案:

答案 0 :(得分:4)

Grails中的服务默认为单例,因此Quartz作业中访问的calculatorService将与其连接的其他类(例如,控制器)中访问的calculatorService相同。

只需将值存储在calculatorService中的类级别,并为控制器添加一个访问器方法来检索数据。

class CalculatorService {

    ConcurrentHashMap cache = [:]

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

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

答案 1 :(得分:0)

您可以使用grailsApplication。只需将grailsApplication注入您的工作,然后使用作业grailsApplication.config.calcResults = calculatorService.runCalculators

保存该值

您可能希望在grailsApplication.config.calcResults中初始化Bootstrap.groovy值,以便在作业第一次运行之前可用。