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

如何在Grails中的Quartz作业开始时运行一次函数,并在调用之间持久化变量值?

西门凯康
2023-03-14

我是Groovy和Grails(和Java),我有一个Quartz调度器的工作(代码如下),想知道

1.)如何在第一次调用作业时(或在应用程序启动时,例如在另一个文件中)执行一些初始化工作(检查数据库和初始化局部变量),但如何在此作业中设置计数器变量?

class MyJob {
    static triggers = {
        simple repeatInterval: 1000l // execute job every 1 second
    }

    // These need to be initiated (with values from a DB) the first time the job is run:
    long myCounter1, myCounter2, myCounter3

    def execute() {

    if(first time job is run / application startup) {
    // get values for counters defined above, from DB
    }
    // else values should persist from last job run

    // Get stuff from database, passing in counter values

}

谢谢

共有1个答案

史良哲
2023-03-14

使用@persistJobDataAfterExecution注释作业,并使用JobDataMap在执行之间存储/检索数据

import org.quartz.*;

@PersistJobDataAfterExecution
public class ExampleJob {

    static triggers = {
        simple repeatInterval: 1000l // execute job every 1 second
    }

    @Override
    void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
        JobDataMap jobDataMap = jobExecutionContext.jobDetails.jobDataMap
        Integer count = jobDataMap.get("count") ?: 0    
        jobDataMap.put("count", ++count)
    }
}
 类似资料:
  • 问题内容: 如何保持在unitttest中继承的同一对象内所做的更改? 即:我希望以上两项测试通过 问题答案: 正如一些评论所回响的那样,以这种方式构造测试可能是测试本身的设计缺陷,您应该考虑对其进行重组。但是,如果您要执行此操作,并且依赖于所使用的测试运行程序以字母(看似)顺序执行它们的事实,那么我建议以下内容。 类似于@Matthias所说的,但是对于以后您可能决定从该类继承的情况,我会做不同

  • 我试图设置一个作业在一个用户使用Quartz的时区的特定时间的单一执行。现在,开箱即用,告诉调度器执行时区中的任何内容的唯一方法是通过。对于Coors,我可能会将datetime转换为cron表达式,然后在第一次成功执行后立即停止触发器,但这有点难闻。 谢谢,

  • 问题内容: 有什么方法可以将结果变量保留在内存中,因此我不必每次运行脚本的开头都重新计算它?每次运行脚本时,我都会对数据集(从磁盘上读取)进行一系列(5-10秒)的确切操作。这不会有太大问题,因为我非常擅长使用交互式编辑器在两次运行之间调试代码。但是有时交互功能只是不切实际。 我知道我可以将结果写到磁盘上的文件中,但是如果可能的话,我想避免这样做。这应该是一个解决方案,它在我第一次运行脚本时会生成

  • 我有每天的cron作业,它应该在00:00运行在所有时区,但当应用程序在维护(可能是一两个小时),部分计划的作业丢失。 是否可以运行在维护期间错过的任务? 在Quartz shoutdown之前(从记录): 石英启动后:

  • 如何使用cron表达式实现我想要的内容? 谁能解释一下石英晶体的这种行为? 提前谢了。

  • 假设我想在2020年2月6日13:50运行一次作业。我该怎么做? 通过使用下面的表达式,我可以得出它将在今天13:50运行。但它明年也会运行。但我希望它只运行一次。