首页 > 解决方案 > Quartz grail插件的问题

问题描述

我有一个 grails 应用程序和一个正在运行的石英作业。该作业包含与以下类似的以下代码。

class MyJob{

  static triggers = {}

  def printLog(msg){
    String threadId = Thread.currentThread().getId()
    String threadName = Thread.currentThread().getName()
    log.info(threadId+" - "+threadName+" : "+msg)
  }

   def execute(context)
    {
       printLog("Before Sync");

       synchronized(MyJob){
         printLog("Inside Sync");
         try{
            printLog("Before sleep 20 minutes")
            Thread.sleep(1200000)
            printLog("After sleep")
          }catch (Exception e){
            log.error("Error while sleeping")
          }
       }
       printLog("After Sync")

    }
  }

我已经安排它每分钟触发一次工作

我可以在日志中看到一个线程正在获取同步块,然后其他作业开始堆积,等待线程完成,这按预期工作。

这里的问题是作业在 10 分钟后停止,此时它已经创建了 10 个线程。其中一个正在休眠 20 分钟,其他 9 个正在等待第一个线程释放锁。为什么没有创造新的就业机会?

我在一些答案中看到我可以通过修改触发器部分来解决问题,如下所示

static triggers = {
  simple repeatInterval: 100
}

我尝试了上述选项,但它仍然只显示 10 个工作。

从哪里采用默认配置 10 ?如何修改值以无限执行?

我是 grails 和石英的新手,所以我不知道发生了什么。

标签: grailsquartz-scheduler

解决方案


我认为 Grails 插件在捆绑的 quartz.properties 文件中将 threadCount 设置为 10,假设您使用的是 Grails 3,您可以像这样在 application.yml 中覆盖:

quartz:
  threadPool:
    threadCount: 25

Grails 2 - application.groovy

quartz {
  props {
    threadPool.threadCount = 100
  }
}

推荐阅读