Quartz.Net学习
如果想要对作业执行时提供参数怎么办?
实际上 JobDetail 提了一个名为 JobDataMap 的属性来保存作业执行时的参数。
Quartz.Net 甚至为Trigger 也提供了一个JobDataMap的属性。
JobDetaMap最初是从 IDictionary 继承下来的,并且通过层层继承实现了传递参数时相关好用的方法。
jobDetail.JobDataMap.Put("hwj383",1);//加入字典表,put和add的区别是put如果有重复键会更新值而不是引发异常
最后在 Execute方里面,通过访问作业执行上下文(Context)中的 JobDetail中的JobDataMap就可以取到值。
public void Execute(JobExecutionContext context)
{
Console.WriteLine(context.JobDetail.JobDataMap.GetInt("hwj383"));
}
public void Execute(JobExecutionContext context) { Console.WriteLine(context.JobDetail.JobDataMap.GetInt("hwj383")); }
但是似乎问题又来了,我们希望保存每次执行的结果,尝试以下代码:
public void Execute(JobExecutionContext context)
{
int i = context.JobDetail.JobDataMap.GetInt("hwj383");
Console.WriteLine(i);
i++;
context.JobDetail.JobDataMap.put("hwj383",i);//更新键hwj383的值
}
public void Execute(JobExecutionContext context) { int i = context.JobDetail.JobDataMap.GetInt("hwj383"); Console.WriteLine(i); i++; context.JobDetail.JobDataMap.put("hwj383",i);//更新键hwj383的值 }
但是遗憾的每次输出仍然是 1 并没有随着每次执行而自动增长 1 (实际上每次执行都会实列化IJob的实现类)
难到就没有办了吗?实际上Quartz.Net为我们提供了另外一个接口:IStatefulJob
从字面意思理解就可以看出是一个状态接口,此接口会维护第次调用间JobDtatMap数据。只需要把类从IJob接口换成IStatefulJob就可以了,上面的代码就可以像您想象的工作了。(实际上第次执行仍会实列化IStatefulJob实现类)
实际上 JobDetail 提了一个名为 JobDataMap 的属性来保存作业执行时的参数。
Quartz.Net 甚至为Trigger 也提供了一个JobDataMap的属性。
JobDetaMap最初是从 IDictionary 继承下来的,并且通过层层继承实现了传递参数时相关好用的方法。
jobDetail.JobDataMap.Put("hwj383",1);//加入字典表,put和add的区别是put如果有重复键会更新值而不是引发异常
最后在 Execute方里面,通过访问作业执行上下文(Context)中的 JobDetail中的JobDataMap就可以取到值。
public void Execute(JobExecutionContext context)
{
Console.WriteLine(context.JobDetail.JobDataMap.GetInt("hwj383"));
}
public void Execute(JobExecutionContext context) { Console.WriteLine(context.JobDetail.JobDataMap.GetInt("hwj383")); }
但是似乎问题又来了,我们希望保存每次执行的结果,尝试以下代码:
public void Execute(JobExecutionContext context)
{
int i = context.JobDetail.JobDataMap.GetInt("hwj383");
Console.WriteLine(i);
i++;
context.JobDetail.JobDataMap.put("hwj383",i);//更新键hwj383的值
}
public void Execute(JobExecutionContext context) { int i = context.JobDetail.JobDataMap.GetInt("hwj383"); Console.WriteLine(i); i++; context.JobDetail.JobDataMap.put("hwj383",i);//更新键hwj383的值 }
但是遗憾的每次输出仍然是 1 并没有随着每次执行而自动增长 1 (实际上每次执行都会实列化IJob的实现类)
难到就没有办了吗?实际上Quartz.Net为我们提供了另外一个接口:IStatefulJob
从字面意思理解就可以看出是一个状态接口,此接口会维护第次调用间JobDtatMap数据。只需要把类从IJob接口换成IStatefulJob就可以了,上面的代码就可以像您想象的工作了。(实际上第次执行仍会实列化IStatefulJob实现类)