我使用 Quartz.Net(版本 2)在每天 8:00 和 20:00(IntervalInHours = 12)在课堂上运行一个方法
一切都很好,因为我使用了与 Quartz.Net 上的教程相同的作业和触发器,但是我需要在类中传递一些参数并根据这些参数运行方法。
谁能帮助我在使用 Quartz.Net 时如何使用参数?
我使用 Quartz.Net(版本 2)在每天 8:00 和 20:00(IntervalInHours = 12)在课堂上运行一个方法
一切都很好,因为我使用了与 Quartz.Net 上的教程相同的作业和触发器,但是我需要在类中传递一些参数并根据这些参数运行方法。
谁能帮助我在使用 Quartz.Net 时如何使用参数?
您可以使用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);
}
}
要扩展@ArsenMkrt 的答案,如果您正在执行2.x 风格的流利作业 config,您可以像这样加载JobDataMap
:
var job = JobBuilder.Create<MyJob>()
.WithIdentity("job name")
.UsingJobData("x", x)
.UsingJobData("y", y)
.Build();
让我对@arsen-mkrtchyan 的帖子进行一些重要的注释,这可能会避免生产中痛苦的支持 Quartz 代码:
请记住 JobDataMap 版本控制,以防您使用持久性 JobStore,例如 AdoJobStore。
文档中也说明了这一点,但并未如此突出,但如果您在应用程序的下一个版本中删除某些参数,则可能会导致大的维护问题:
如果您使用持久的 JobStore(在本教程的 JobStore 部分讨论),您应该谨慎决定在 JobDataMap 中放置什么,因为其中的对象将被序列化,因此它们容易出现类版本问题。
还有相关文档中提到的有关配置 JobStore 的相关说明:
可以将“quartz.jobStore.useProperties”配置参数设置为“true”(默认为 false),以指示 AdoJobStore JobDataMaps 中的所有值都是字符串,因此可以存储为名称-值对,而不是存储BLOB 列中的序列化形式的更复杂的对象。从长远来看,这更安全,因为您避免了将非字符串类序列化为 BLOB 时存在的类版本控制问题。