如何在Quartz.Net中向类发送参数

28

我正在使用Quartz.Net(版本2)每天在8:00和20:00运行类中的一个方法(IntervalInHours = 12)。

自从我像Quartz.Net教程一样使用相同的作业和触发器以来,一切都很好,但我需要传递一些参数到类中,并根据这些参数运行方法。

有人能帮我解决如何在使用Quartz.Net时使用参数的问题吗?

3个回答

45

您可以使用 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);
    }
} 

JobDataMap的链接已损坏。 - Sanmoy
实际上Quartz.net移动或删除了官方文档,已经删掉了链接,但我认为即使没有链接,它仍然存在。 - Arsen Mkrtchyan

13

针对@ArsenMkrt的回答进行补充,如果你正在使用2.x风格的流畅任务配置,可以像这样加载JobDataMap

var job = JobBuilder.Create<MyJob>()
    .WithIdentity("job name")
    .UsingJobData("x", x)
    .UsingJobData("y", y)
    .Build();

9
除了 UsingJobData() 仅有少数几种值类型的重载。 - David Clarke

1

摘要

让我稍微扩展一下@arsen-mkrtchyan的帖子,提供一个重要的注释,可能会避免在生产中支持Quartz代码时出现痛苦:

问题(对于持久化JobStore)

请记住在使用持久化JobStore(例如AdoJobStore)时考虑JobDataMap版本控制

总结(TL;DR)

  • 仔细考虑构建/编辑您的JobData,否则将导致触发未来作业时出现问题。
  • 启用“quartz.jobStore.useProperties”配置参数,因为官方文档建议可以最小化版本控制问题。稍后使用JobDataMap.PutAsString()

详情

文档中也有说明,但没有那么突出,如果您在应用程序的下一个版本中删除某些参数,则可能会导致大量的维护问题:

如果您使用持久性JobStore(在本教程的JobStore部分中讨论),则应谨慎决定将什么放入JobDataMap中,因为其中的对象将被序列化,因此容易出现类版本问题。另外,在相关文档中提到了有关配置JobStore的注意事项:
“quartz.jobStore.useProperties”配置参数可以设置为“true”(默认为false),以指示AdoJobStore所有JobDataMaps中的值都是字符串,因此可以存储为名称-值对,而不是将更复杂的对象存储在其序列化形式的BLOB列中。从长远来看,这样做更加安全,因为避免了将非String类序列化为BLOB时存在的类版本问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接