【问题标题】:Grails Quartz Plugin error with jdbcStorejdbcStore 的 Grails Quartz 插件错误
【发布时间】:2014-01-07 04:14:31
【问题描述】:

我尝试使用来自 Grails 的最新石英插件:quartz:1.0.1。

如果我离开 jdbcStore = false,它会工作,如果我设置为 true,它会失败。 QuartzConfig.groovy:

    quartz {
       autoStartup = true
       jdbcStore = true
       waitForJobsToCompleteOnShutdown = true
       exposeSchedulerInRepository = false

    props {
        scheduler.skipUpdateCheck = true
     }
    }

这是属性文件:

    org.quartz.scheduler.instanceName reporting_test
    org.quartz.scheduler.instanceId AUTO

    org.quartz.threadPool.class org.quartz.simpl.SimpleThreadPool
    org.quartz.threadPool.threadCount 5
    org.quartz.threadPool.threadPriority 5

    org.quartz.jobStore.misfireThreshold 60000

    org.quartz.jobStore.class org.quartz.impl.jdbcjobstore.JobStoreTX
    org.quartz.jobStore.driverDelegateClass org.quartz.impl.jdbcjobstore.StdJDBCDelegate

    org.quartz.jobStore.useProperties false
    org.quartz.jobStore.tablePrefix QRTZ_
    org.quartz.jobStore.isClustered true
    org.quartz.jobStore.clusterCheckinInterval 5000

    org.quartz.plugin.shutdownhook.class org.quartz.plugins.management.ShutdownHookPlugin
    org.quartz.plugin.shutdownhook.cleanShutdown true

我一直在尝试使用 Datasource 设置,因为我更喜欢使用在 Datasource.groovy 中设置的默认 DS。无论数据源的设置如何,我在启动时仍然会收到以下错误消息。

        2013-12-18 13:43:14,693 [localhost-startStop-1] ERROR context.GrailsContextLoader  - Error initializing the application: org.quartz.impl.jdbcjobstore.LockException: Failure obtaining db row lock: Line 1: FOR UPDATE clause allowed only for DECLARE CURSOR. [See nested exception: com.microsoft.sqlserver.jdbc.SQLServerException: Line 1: FOR UPDATE clause allowed only for DECLARE CURSOR.]
        org.codehaus.groovy.runtime.InvokerInvocationException: org.quartz.impl.jdbcjobstore.LockException: Failure obtaining db row lock: Line 1: FOR UPDATE clause allowed only for DECLARE CURSOR. [See nested exception: com.microsoft.sqlserver.jdbc.SQLServerException: Line 1: FOR UPDATE clause allowed only for DECLARE CURSOR.]
            at java.util.concurrent.FutureTask.run(FutureTask.java:262)
            at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
            at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
            at java.lang.Thread.run(Thread.java:744)
        Caused by: org.quartz.impl.jdbcjobstore.LockException: Failure obtaining db row lock: Line 1: FOR UPDATE clause allowed only for DECLARE CURSOR. [See nested exception: com.microsoft.sqlserver.jdbc.SQLServerException: Line 1: FOR UPDATE clause allowed only for DECLARE CURSOR.]
            at org.quartz.impl.jdbcjobstore.StdRowLockSemaphore.executeSQL(StdRowLockSemaphore.java:157)
            at org.quartz.impl.jdbcjobstore.DBSemaphore.obtainLock(DBSemaphore.java:113)
            at org.quartz.impl.jdbcjobstore.JobStoreCMT.executeInLock(JobStoreCMT.java:238)
            at org.quartz.impl.jdbcjobstore.JobStoreSupport.storeJob(JobStoreSupport.java:1086)
            at org.quartz.core.QuartzScheduler.addJob(QuartzScheduler.java:969)
            at org.quartz.core.QuartzScheduler.addJob(QuartzScheduler.java:958)
            at org.quartz.impl.StdScheduler.addJob(StdScheduler.java:268)
            at QuartzGrailsPlugin.scheduleJob(QuartzGrailsPlugin.groovy:268)
            at QuartzGrailsPlugin$_closure5_closure23.doCall(QuartzGrailsPlugin.groovy:248)
            at QuartzGrailsPlugin$_closure5.doCall(QuartzGrailsPlugin.groovy:247)
            ... 4 more
        Caused by: com.microsoft.sqlserver.jdbc.SQLServerException: Line 1: FOR UPDATE clause allowed only for DECLARE CURSOR.
            at org.apache.commons.dbcp.DelegatingPreparedStatement.executeQuery(DelegatingPreparedStatement.java:96)
            at org.apache.commons.dbcp.DelegatingPreparedStatement.executeQuery(DelegatingPreparedStatement.java:96)
            at org.quartz.impl.jdbcjobstore.StdRowLockSemaphore.executeSQL(StdRowLockSemaphore.java:96)
            ... 13 more

这些表存在于我的数据库中。我实际上将它们与用于 grails 的quartz2 插件一起使用,但是由于各种原因决定尝试这个插件。

关于我设置不正确的任何想法?

【问题讨论】:

    标签: grails quartz-scheduler grails-plugin


    【解决方案1】:

    找到答案了。

    正在运行一个查询来锁定行,在这种情况下失败时是:

    SELECT * FROM QRTZ_LOCKS WHERE SCHED_NAME = 'reporting_test' AND LOCK_NAME = 'STATE_ACCESS' FOR UPDATE
    

    FOR UPDATE 不适用于 MSSQL 数据库。我发现我使用了错误的代表。我将我的财产切换到:

    org.quartz.jobStore.driverDelegateClass org.quartz.impl.jdbcjobstore.MSSQLDelegate
    

    这行得通,希望这对其他人有帮助。

    【讨论】:

    • “切换我的财产”是什么意思?
    • @KorayTugay 在您的石英项目的配置文件中,您将拥有配置石英调度程序的设置。他的意思是他改变了这些以利用MSSQLDelegate。我在 web 项目中使用了quartz,所以我需要更改的属性可以在我的 Web.config 中找到。
    • 这在 Quartz SQL Script 的 cmets 部分可用,我一开始就没有注意到
    猜你喜欢
    • 1970-01-01
    • 2017-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-14
    相关资源
    最近更新 更多