应该如何正确使用Quartz

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了应该如何正确使用Quartz相关的知识,希望对你有一定的参考价值。

第一步
导入相关的jar包

第二步
创建定时任务

一个定时任务对应一个Job实现类。例如:
MyJob类为需要定时执行的类 --->

public class MyJob implements Job
//MyJob类为需要定时执行的类,execute为定时执行的方法。一个定时任务对应一个Job实现类。
@Override
public void execute(JobExecutionContext arg0) throws JobExecutionException
//业务逻辑
System.out.println("执行时间:"+new Date());



第三步

执行都是任务
public static void main(String[] args) throws Exception
//SchedulerFactory 是一个接口,用于Scheduler的创建和管理
SchedulerFactory factory = new StdSchedulerFactory();
//从工厂里面拿到一个scheduler实例
//计划表(可能翻译的不太贴切),现在我们有了要做的内容,
//与调度程序交互的主要API
/*
* Scheduler的生命期,从SchedulerFactory创建它时开始,
到Scheduler调用shutdown()方法时结束;Scheduler被创建后,
可以增加、删除和列举Job和Trigger,以及执行其它与调度相关的操作
(如暂停Trigger)。但是,Scheduler只有在调用start()方法后,
才会真正地触发trigger(即执行job)
*/
Scheduler scheduler = factory.getScheduler();
//具体任务.
//用于定义作业的实例
//JobBuilder - 用于定义/构建JobDetail实例,用于定义作业的实例。
JobDetail job = JobBuilder.newJob(MyJob.class).withIdentity("job1", "group1").build();

//Trigger(即触发器) - 定义执行给定作业的计划的组件
//TriggerBuilder - 用于定义/构建触发器实例
CronTrigger trigger = TriggerBuilder.newTrigger().withIdentity("trigger1", "group1")
.withSchedule(CronScheduleBuilder.cronSchedule("0/1 * * * * ?")).build();
scheduler.scheduleJob(job, trigger);
scheduler.start();

参考技术A 马致远《天净沙秋思》夕阳西下,断肠人在天涯。

如何在 Quartz.Net 中向类发送参数

【中文标题】如何在 Quartz.Net 中向类发送参数【英文标题】:How to send argument to class in Quartz.Net 【发布时间】:2012-12-01 04:37:33 【问题描述】:

我使用 Quartz.Net(第 2 版)在每天 8:00 和 20:00(IntervalInHours = 12)在课堂上运行一个方法

一切都很好,因为我使用了与 Quartz.Net 上的教程相同的作业和触发器,但我需要在类中传递一些参数并根据这些参数运行方法。

谁能帮我在使用 Quartz.Net 时如何使用参数?

【问题讨论】:

【参考方案1】:

您可以使用JobDataMap

jobDetail.JobDataMap["jobSays"] = "Hello World!";
jobDetail.JobDataMap["myFloatValue"] =  3.141f;
jobDetail.JobDataMap["myStateData"] = new ArrayList(); 

public class DumbJob : IJob

    public void Execute(JobExecutionContext context)
    
        string instName = context.JobDetail.Name;
        string instGroup = context.JobDetail.Group;

        JobDataMap dataMap = context.JobDetail.JobDataMap;

        string jobSays = dataMap.GetString("jobSays");
        float myFloatValue = dataMap.GetFloat("myFloatValue");
        ArrayList state = (ArrayList) dataMap["myStateData"];
        state.Add(DateTime.UtcNow);

        Console.WriteLine("Instance 0 of DumbJob says: 1", instName, jobSays);
    
 

【讨论】:

JobDataMap 链接已损坏 其实quartz.net移动或者删除官方文档,删除链接,我觉得没有链接也可以存在【参考方案2】:

要扩展@ArsenMkrt 的答案,如果您正在使用2.x-style fluent job config,您可以像这样加载JobDataMap

var job = JobBuilder.Create<MyJob>()
    .WithIdentity("job name")
    .UsingJobData("x", x)
    .UsingJobData("y", y)
    .Build();

【讨论】:

除了UsingJobData() 只有少数值类型的重载【参考方案3】:

摘要

让我对@arsen-mkrtchyan 的帖子进行一些重要的注释,这可能会避免生产中痛苦的支持 Quartz 代码:

问题(对于持久性 JobStore)

请记住 JobDataMap 版本控制,以防您使用持久性 JobStore,例如AdoJobStore。

摘要 (TL;DR)

仔细考虑构建/编辑您的 JobData 否则会导致触发未来工作的问题。 启用“quartz.jobStore.useProperties”配置参数为official documentation recommends,以最大限度地减少版本控制问题。稍后使用JobDataMap.PutAsString()

详情

文档中也有说明,但是没有特别强调,但可能会导致大的维护问题,例如您在下一个版本的应用程序中删除了一些参数:

如果您使用持久性 JobStore(在本教程的 JobStore 部分讨论),您应该谨慎决定在 JobDataMap 中放置什么,因为其中的对象将被序列化,因此它们很容易出现类-版本控制问题。

还有relevant document中提到的关于配置JobStore的相关说明:

“quartz.jobStore.useProperties”配置参数可以设置为“true”(默认为false),以指示AdoJobStore JobDataMaps中的所有值都是字符串,因此可以存储为名称-值对,而不是在 BLOB 列中以序列化形式存储更复杂的对象。从长远来看,这更安全,因为您避免了将非字符串类序列化为 BLOB 时存在的类版本控制问题。

【讨论】:

以上是关于应该如何正确使用Quartz的主要内容,如果未能解决你的问题,请参考以下文章

应该如何正确使用Quartz

我应该如何正确管理 JSON 提供的图像

实际业务中应该如何正确使用缓存

你应该如何正确健壮后端服务?

如何使用 curl 正确发送和接收 XML?

我应该如何使用Ripple-lib或官方api正确创建Ripple Paper钱包?