我正在使用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风格的流畅任务配置,可以像这样加载JobDataMap
:
var job = JobBuilder.Create<MyJob>()
.WithIdentity("job name")
.UsingJobData("x", x)
.UsingJobData("y", y)
.Build();
UsingJobData()
仅有少数几种值类型的重载。 - David Clarke让我稍微扩展一下@arsen-mkrtchyan的帖子,提供一个重要的注释,可能会避免在生产中支持Quartz代码时出现痛苦:
请记住在使用持久化JobStore(例如AdoJobStore)时考虑JobDataMap版本控制。
文档中也有说明,但没有那么突出,如果您在应用程序的下一个版本中删除某些参数,则可能会导致大量的维护问题:
如果您使用持久性JobStore(在本教程的JobStore部分中讨论),则应谨慎决定将什么放入JobDataMap中,因为其中的对象将被序列化,因此容易出现类版本问题。另外,在相关文档中提到了有关配置JobStore的注意事项: