#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 экземпляры заданий являются одиночными по соображениям производительности и не инициируются повторно при каждом запуске