.Net Core 下使用 Quartz —— 【3】作业和触发器之作业传参

8 篇文章 0 订阅
7 篇文章 0 订阅

 

目录

1、作业的实例

2、JobDataMap

3、用属性接收参数

4、触发器参数

在上一篇中,我们简单了解了什么是作业和作业的上下文,以及作业唯一标识,接下来我们将继续了解作业的传参


 

1、作业的实例

在调度程序每次执行作业的Execute()方法之前,都会创建该作业新的实例

这就意味着:

1、我们编写的作业,必须具有无二义性的构造函数

2、在job类中定义数据字段是没有意义的,因为调度程序每次都创建新实例,不会维护这些字段。

 

2、JobDataMap

JobDataMap 可以提供可序列化的对象JobDataMapIDictionary接口的实现,并具有一些用于存储和检索基本类型数据的便捷方法。

JobDataMap 中还有一些辅助方法,比如 GetKeys、Put 、GetInt 等等,这里不详细介绍了

我们修改之前创建 jobdetail 的代码, 使用 UsingJobData 增加一个 key是 "name" 值为  "zhangsan" 数据项

            IJobDetail job = JobBuilder.Create<HelloJob>()
                .WithIdentity("job1", "jobGroup1")
                .UsingJobData("name","zhangsan")
                .Build();

然后修改具体的 作业类,来接收我们的参数

    public class HelloJob : IJob
    {
        public async Task Execute(IJobExecutionContext context)
        {
            JobDataMap dataMap = context.JobDetail.JobDataMap;
            string name = dataMap.GetString("name");
            await Console.Out.WriteLineAsync($"{DateTime.Now}:{name}");
        }
    }

下面是输出结果:

 

注意:这种以字符串的形式直接写入参数并不友好,Quartz提示我们,如果我们使用了持久化数据的功能,那么很可能因为修改了参数的key而导致序列化问题,这里我们看一下官方给的示例的做法:

 

在job里定义参数常量


using System;
using System.Threading.Tasks;

namespace Quartz.Examples.Example04
{
    public class ColorJob : IJob
    {
        public const string FavoriteColor = "favorite color";
        public const string ExecutionCount = "count";

        public virtual Task Execute(IJobExecutionContext context)
        {


            // Grab and print passed parameters
            JobDataMap data = context.JobDetail.JobDataMap;

            var favoriteColor = data.GetString(FavoriteColor);
            int count = data.GetInt(ExecutionCount);

            ...
        }
    }
}

通过常量传值

 IJobDetail job2 = JobBuilder.Create<ColorJob>()
                .WithIdentity("job2", "group1")
                .Build();

 job2.JobDataMap.Put(ColorJob.FavoriteColor, "Red");
 job2.JobDataMap.Put(ColorJob.ExecutionCount, 1);

当然,你也可以使用别的方法,比如自己编写类映射等等

 

3、用属性接收参数

如果您在作业类中添加了具有set访问器的属性,这些属性与JobDataMap中的键名称相对应,则Quartz的默认JobFactory实现将在实例化该作业时自动调用这些setter,避免了自己编写获取参数的代码部分。请注意,使用自定义JobFactory时,默认情况下不维护此功能。

我们修改HelloJob代码

    public class HelloJob : IJob
    {
        public string Name { private get; set; }
        public async Task Execute(IJobExecutionContext context)
        {
            JobDataMap dataMap = context.JobDetail.JobDataMap;
            await Console.Out.WriteLineAsync($"{DateTime.Now}:{Name}");
        }
    }

注意属性名称开头大写,这里我使用小写无效

 

4、触发器参数

当我们需要同一个作业根据不同的触发器传递不同的参数时,这非常有用

触发器参数如果和作业参数同名,那将代替作业参数

 

            //1、从工厂获取调度器实例
            IScheduler scheduler = await _schedulerFactory.GetScheduler();

            //2、开始调度
            await scheduler.Start();

            //3、定义作业并将其绑定到我们的HelloJob类,作业名为job1 作业组名jobGroup1
            IJobDetail job = JobBuilder.Create<HelloJob>()
                .WithIdentity("job1", "jobGroup1")
                .UsingJobData("name","zhangsan")
                .Build();

            //4、创建一个立即执行的触发器,每间隔3秒触发一次,触发器名为trigger1,触发器组名triggerGroup1
            ITrigger trigger = TriggerBuilder.Create()
                .WithIdentity("trigger1", "triggerGroup1")
                .StartNow()
                .UsingJobData("name", "zhangsan")
                .WithSimpleSchedule(x => x.WithIntervalInSeconds(3).RepeatForever())
                .Build();

            //5、创建第二个触发器,绑定给job
            ITrigger trigger2 = TriggerBuilder.Create()
                .WithIdentity("trigger2", "triggerGroup1")
                .StartNow()
                .UsingJobData("name", "lisi")
                .WithSimpleSchedule(x => x.WithIntervalInSeconds(3).RepeatForever())
                .ForJob(job)
                .Build();

            //6、将触发器与作业进行绑定
            await scheduler.ScheduleJob(job,trigger);
            await scheduler.ScheduleJob(trigger2);

从上面的代码可以看出,我们自己的作业实例中定义了 name 参数

并且在 两个触发器中也都定义了同名的 name  参数

下面是运行结果:

 

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值