【问题标题】:How to store result of quartz job in session?如何在会话中存储石英作业的结果?
【发布时间】:2012-09-07 13:26:22
【问题描述】:

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

有没有办法将 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
    }
}

【问题讨论】:

    标签: grails quartz-scheduler grails-2.0


    【解决方案1】:

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

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

    class CalculatorService {
    
        ConcurrentHashMap cache = [:]
    
        def runCalculators() {
            // Do calculations
            cache.result1 = calculatedResult1
            // etc...
        }
    
        def retrieveCalculation(String key) {
            cache[(key)]
        }
    }
    

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 否决这个答案的人是否愿意解释他们的反对意见?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-11-18
      • 2015-06-19
      • 1970-01-01
      • 2010-12-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多