【问题标题】:Grails Quartz plugin not remembering stateful data between job executions?Grails Quartz 插件不记得作业执行之间的状态数据?
【发布时间】:2019-08-03 01:08:23
【问题描述】:

我需要在 Grails Quartz 插件作业的执行之间保留一个计数器值。它以正确的时间间隔运行,我可以设置 jobDataMap 并正确读取值(在同一执行运行期间),但它拒绝在两次执行之间记住它。

我按照文档的建议设置了concurrent = false。有任何想法吗?我只需要坚持并增加一个计数器。如果可能的话,我想避免使用数据库,我认为这应该只使用内存?还是其他变通方法?

我的 TestJob.groovy,在 /server/grails-app/jobs:

package myPackage
class MyJob {
    static triggers = {
        simple repeatInterval: 5000l // execute job every 5 seconds
    }

    def concurrent = false // Don't run multiple simultaneous instances of this job

    def execute(context) {
        if(context.jobDetail.jobDataMap['recCounter'] == null) { context.jobDetail.jobDataMap['recCounter'] = 1 }
        else { context.jobDetail.jobDataMap['recCounter'] = context.jobDetail.jobDataMap['recCounter'] + 1 }

        println(context.jobDetail.jobDataMap['recCounter'])
}

运行时的输出是每 5 秒带有 '1' 的新行。每次都应该递增计数器。

1
1
1
1
etc..

我正在运行 Grails 3.3.9 并且 build.gradle 在依赖项中有 compile "org.grails.plugins:grails-spring-websocket:2.4.1"

谢谢

【问题讨论】:

  • AtomicInteger counter = new AtomicInteger() 呢?
  • @injecteer 好的...我是 Grails 和 Java 的新手,请问如何在我的代码上下文中使用它?

标签: grails groovy quartz-scheduler grails-plugin


【解决方案1】:

我从未在我的应用程序中使用过context 对象,但可以以直接的方式实现计数器:

class MyJob {
    //some static stuff

    AtomicInteger counter = new AtomicInteger()

    def execute(context) {
        counter.incrementAndGet()    
        println counter.intValue()
    }
}

【讨论】:

  • 非常感谢。你认为这会在作业执行之间持续存在吗?
  • 应该。 AFAIK 由于性能原因,作业实例是单例的,并且不会在每次触发时重新实例化
猜你喜欢
  • 2016-07-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-09
  • 1970-01-01
  • 2011-05-28
  • 1970-01-01
相关资源
最近更新 更多