当前位置: 首页 > 知识库问答 >
问题:

如何在Grails中配置Quartz触发器以允许不同的测试和生产计划

白文彬
2023-03-14

我试图在Grails 2.2.4中采用Quartz插件(:Quartz:1.0.1),并试图弄清楚如何允许开发和测试使用不同于生产所需的进度表,而不必更改部署到每个进度表的代码。

以下是我的经验。

我正在使用一个JDBC JobStore和Quartz Monitor插件(:Quartz-Monitor:1.0)。所以我的工作是这样定义的:

class TestJob {
    static triggers = {
        cron name: 'testTrigger', startDelay: 1000, cronExpression: '0 0/1 * * * ?'
    }
    ...
}

当我运行Grails应用程序时,将为作业设置触发器,并将其存储在数据库中,然后开始执行。如果我通过Quartz Monitor对cron表达式进行有意的更改,它将反映在数据库和执行日程中。

如果我现在重新启动应用程序,则触发器将更改为作业中定义的触发器。因此,使用这种方法,我几乎无法处理该作业的触发器块中的任何内容。如果我完全从代码中删除触发器块,那么数据库定义将保持不变,并控制调度,这似乎是一个改进。

因此,我认为不在作业中定义任何触发器是有意义的,但这让我不得不首先考虑如何加载触发器,并且以一种不覆盖有意更改的方式加载触发器。在配置中添加一个块(可能在外部配置文件中)来定义触发器似乎是有意义的。据我所知,在启动时(在引导程序中?),我需要写一些东西来解析它并通过Quartz API应用。

在我的文档阅读和谷歌搜索中,是否已经存在这样的内容?或者也许我在一个更根本的方面是错误的。

更新一些实现细节

汉斯给了我一些关于什么适合我的情况的想法。

我最终关闭了JDBC作业存储,因为我决定配置应该是触发的权限。我将作业/触发器信息放入如下所示的外部配置文件中。

quartzJobs: [
    'TestJob': [
        cronTriggers: [
            cronExpression: '0 0 7 ? * 2-6'
        ]
    ]
]

然后我在BootStrap中调用了一些代码,如下所示。

def jobs = grailsApplication.config.quartzJobs
if (jobs) {
    jobs.each { job, details ->
        List triggers = (details?.cronTriggers instanceof Map) ? [details.cronTriggers]: details.cronTriggers
        if (triggers) {
            def j = grailsApplication.mainContext.getBean(job)
            triggers.each { trigger ->
                String cronExpression = trigger.cronExpression ?: '1 1 1 1 1 ? 2099'
                j.schedule(cronExpression)
            }
        }
    }
}

共有1个答案

常宸
2023-03-14

您可以将配置放在config.groovy或从grails.config.locations读取的属性文件中。

然后在bootstrap.groovy中可以执行以下操作:

TestJob.schedule(grailsApplication.config.cronExpression)

在此cronexpression是您在属性文件中选择的属性的名称。

有关可用的不同job.schedule()方法,请参阅http://grails-plugins.github.io/grails-quartz/guide/triggers.html

 类似资料:
  • 问题内容: 假设我有一个类似 测试此bean实际上将在其指定日期( 即 最接近每月15日的工作日)触发的最佳方法是什么? 更新 :这应该是一个单元测试,所以我不会启动虚拟机或更改系统时间。 问题答案: 首先,没有必要进行自我测试。它是spring框架的一部分,已经过测试。 更好的测试可能是测试您的cron表达式是否符合您的期望。这里的一种选择是使用Quartz的类。给定一个对象,您可以调用,该表达

  • 问题内容: 我将docker用于laravel项目的开发和生产。我用于开发和生产的dockerfile略有不同。例如,我在开发环境中将本地目录安装到docker容器中,因此我不需要为代码中的每个更改进行docker构建。 由于挂载目录仅在运行docker容器时可用,因此无法在开发文件中将诸如“ composer install”或“ npm install”之类的命令放入dockerfile中。

  • 我使用docker为laravel项目开发和生产。我有一个稍微不同的dockerfile用于开发和生产。例如,我在开发环境中将本地目录装载到docker容器中,这样我就不需要为代码中的每个更改进行docker构建。 由于挂载目录只有在运行docker容器时才可用,因此我无法将“composer install”或“npm install”之类的命令放入dockerfile中进行开发。 目前,我正在

  • 我是自动化UI测试的新手,我正在使用Cucumber和Selenium研究UI自动化。 所以在我的项目中,我创建了一个钩子类来设置web驱动程序进行测试。类似这样的事情: 但是如果我想用不同的浏览器和不同的环境运行相同的测试。例如,我想用chrome和环境A运行测试,用firefox和环境B运行相同的测试。我计划为不同的环境创建两个属性文件

  • 对于每个,我必须设置一个,该作业将具有不同的触发器。 有可能吗?