【问题标题】:Trigger Error when Triggering immediate Quartz Job with Grails使用 Grails 触发即时 Quartz 作业时触发错误
【发布时间】:2014-02-05 23:28:30
【问题描述】:

我正在建立一个用户可以请求异步运行任务的系统。

我将这些任务存储在 Grails 域类 ScheduledTask 的表中。

我有两个 Quartz 工作

  • CheckForScheduledTasksJob
    • 每 30 秒触发一次
  • RunActionJob
    • 在需要时按需触发
    • (将来会同时运行可配置的数量。)

目前的代码流程是:

CheckForScheduledTasksJob

CheckForScheduledTasksJob {
    void execute() {
        taskService.checkForScheduledTasks()
    }
}

任务服务

void checkForScheduledTasks() {
    ScheduledTask scheduleTask = getNextPendingTask()

    if (scheduleTask) {
         Map params = [ scheduleTask:scheduleTask ]
         RunActionJob.triggerNow(params)
    }
}

此时我收到以下错误:

| Error 2014-01-02 15:00:01,112 [quartzScheduler_QuartzSchedulerThread] ERROR core.ErrorLogger  - An error occurred while scanning for the next triggers to fire.
Message: Couldn't acquire next trigger: Couldn't retrieve trigger: com.mypath.RunActionJob
    Line | Method
->> 2848 | acquireNextTrigger        in org.quartz.impl.jdbcjobstore.JobStoreSupport
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
|   2759 | execute                   in org.quartz.impl.jdbcjobstore.JobStoreSupport$40
|   2757 | execute . . . . . . . . . in     ''
|   3787 | executeInNonManagedTXLock in org.quartz.impl.jdbcjobstore.JobStoreSupport
|   2756 | acquireNextTriggers . . . in     ''
^    272 | run                       in org.quartz.core.QuartzSchedulerThread
Caused by JobPersistenceException: Couldn't retrieve trigger: com.mypath.RunActionJob
->> 1533 | retrieveTrigger           in org.quartz.impl.jdbcjobstore.JobStoreSupport
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
|   2808 | acquireNextTrigger        in     ''
|   2759 | execute . . . . . . . . . in org.quartz.impl.jdbcjobstore.JobStoreSupport$40
|   2757 | execute                   in     ''
|   3787 | executeInNonManagedTXLock in org.quartz.impl.jdbcjobstore.JobStoreSupport
|   2756 | acquireNextTriggers       in     ''
^    272 | run . . . . . . . . . . . in org.quartz.core.QuartzSchedulerThread

RunActionJob 的代码仍在开发中。到目前为止,它看起来是:

class RunActionJob implements InterruptableJob, Serializable {
    boolean interrupted = false

    static triggers = {
    }

    void execute(JobExecutionContext context) {
        log.info ("HERE " + (new Date()))

        ScheduledTask task = context.getMergedJobDataMap()?.scheduleTask 

        return
    }

    void interrupt() {
        interrupted = true
    }

}

提前感谢您的任何帮助或回复。

【问题讨论】:

  • 我发现如果我在没有参数的情况下以 RunActionJob.triggerNow() 的形式触发作业,它就可以工作。但是,这对我没有帮助,因为我需要将各种参数传递给 Job。
  • 在你的工作中定义一个空的静态触发器,例如:static triggers = {},看看它是否有帮助。这个question 也可能有帮助
  • 能否请您提一下 RunActionJob 类的代码?
  • @Alidad:我的工作中确实有static triggers = {}。有它或没有它都没有区别。我之前看到过另一个问题,希望该解决方案也对我有用,但它没有。
  • @Ak Goel:我添加了上面的代码。

标签: exception grails quartz-scheduler


【解决方案1】:

通过反复试验,我最终发现导致此问题的原因是在 params 中传递了 ScheduledTask 类。我认为该类存在序列化错误。

如果我只是在参数中传递 ScheduledTask.id,然后将 id 转换为 RunActionJob 中的完整对象,那么一切都按预期开始工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-04
    • 1970-01-01
    • 1970-01-01
    • 2011-10-25
    • 2011-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多