skyfeathers

导航

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实现类)

posted on 2011-11-15 10:37  天羽  阅读(645)  评论(0编辑  收藏  举报