【问题标题】:Grails - QuartzGrails - 石英
【发布时间】:2010-09-10 11:27:46
【问题描述】:

我正在尝试使用 Grails 的 Quartz 插件在我正在开发的 Web 应用程序中安排工作。使用 RAMstore 工作正常,但我需要将作业持久化到我们的 SQLServer 数据库中,这导致了问题...

我已将 QuartzConfig.groovy 中的 jdbcStore 变量更改为 true,在 作业文件,并使用 SQLServer 代码在数据库中生成所需的表,但不断获取 一个错误:

org.quartz.impl.jdbcjobstore.LockException:获取数据库行锁失败:第 1 行:FOR UPDATE 子句仅允许用于 DECLARE CURSOR。 [请参阅嵌套异常:com.microsoft.sqlserver.jdbc.SQLServerException:第 1 行:FOR UPDATE 子句仅允许用于 DECLARE CURSOR。]

有一个想法可能与未为 SQLServer 数据库配置石英插件有关, 但在网上没有找到太多关于它的信息(主要是石英而不是 grails 的完整 java 实现), 并且尝试配置文件并没有帮助。

有谁知道如何让它工作?以及 grails 实际使用的各种 Quartz 配置文件中的哪一个?

感谢您的帮助

【问题讨论】:

  • 你使用的是什么版本的 Quartz 插件?
  • 抱歉 Joshua,我不再从事这个项目了。不记得我在做什么。

标签: sql-server-2008 grails quartz-scheduler


【解决方案1】:

我在几个项目中使用了quartz:1.0.2。
我不会坚持我的工作,我会为每个工作分配一个唯一的名称。 然后我使用我创建的域来保持我的工作状态以跟踪工作的状态。

例如,我的作业的执行部分使用作业名称查找其状态跟踪域,这是我从每个作业的属性文件中加载的唯一值。 然后我将与此作业关联的 FileImporter 实例传递给我的服务,该服务执行作业的所有条件状态。

        FileImporter fileImporter1 = FileImporter.findByName(jobName);
        fileImporterService.importWhileEnabled(fileImporter1);

我的服务不是事务性的,因为我希望立即保持作业状态。这样,如果我重新启动我的应用程序,作业的最后状态是已知的,我可以从它停止的地方继续。
但是,我通常只是重置作业状态,使其在重新启动 Web 服务器后重新开始。

在我的服务中我使用

static transactional = false

并立即使用 flush: true 保持状态

fileImporter.save(failOnError: true, flush: true);

【讨论】:

    猜你喜欢
    • 2011-05-01
    • 2016-08-07
    • 2012-11-22
    • 2015-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多