Плагин Grails Quartz не запоминает данные о состоянии между выполнением заданий?

#grails #groovy #quartz-scheduler #grails-plugin

#grails #groovy #quartz-планировщик #grails-плагин

Вопрос:

Мне нужно сохранять значение счетчика между выполнением задания плагина Grails Quartz. Это выполняется с правильно рассчитанными интервалами, и я могу установить JobDataMap и правильно прочитать значение обратно (во время того же выполнения), но оно отказывается запоминать его между выполнением.

Я установил concurrent = false так, как советовали документы. Есть идеи? Мне просто нужно сохранить и увеличить счетчик. Я хочу избежать использования базы данных, если это вообще возможно, я думаю, что это должно просто использовать память? Или другие обходные пути?

Мое тестовое задание.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'])
}
  

Вывод при запуске представляет собой новую строку с ‘1’ каждые 5 секунд. Он должен увеличивать счетчик каждый раз.

 1
1
1
1
etc..
  

Я использую Grails 3.3.9, и build.gradle имеет compile "org.grails.plugins:grails-spring-websocket:2.4.1" в зависимостях

Спасибо

Комментарии:

1. как насчет AtomicInteger counter = new AtomicInteger() ?

2. @injecteer ХОРОШО … Я новичок в Grails amp; Java, как бы мне использовать это в контексте моего кода, пожалуйста?

Ответ №1:

Я никогда не использовал context object в своих приложениях, но счетчик может быть реализован простым способом:

 class MyJob {
    //some static stuff

    AtomicInteger counter = new AtomicInteger()

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

Комментарии:

1. Большое спасибо. И это будет сохраняться между выполнением заданий, как вы думаете?

2. так и должно быть. AFAIK экземпляры заданий являются одиночными по соображениям производительности и не инициируются повторно при каждом запуске