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

时间:2012-12-13 09:59:44

标签: c# arguments quartz.net quartz.net-2.0

我正在使用Quartz.Net(版本2)每天8:00和20:00在课堂上运行方法(IntervalInHours = 12)

一切都很好,因为我使用了与Quartz.Net上的教程相同的工作和触发器,但我需要在类中传递一些参数并根据这些参数运行方法。

任何人都可以帮助我在使用Quartz.Net时如何使用参数吗?

3 个答案:

答案 0 :(得分:34)

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

答案 1 :(得分:9)

要扩展@ArsenMkrt的答案,如果您正在执行2.x-style fluent job config,则可以像这样加载JobDataMap

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

答案 2 :(得分:0)

摘要

让我延长一点@ arsen-mkrtchyan帖子,注意到可能会避免在生产中支持Quartz代码的痛苦支持:

问题(持久性JobStore)

请记住JobDataMap版本控制,以防您使用持久性JobStore,例如: AdoJobStore。

摘要(TL; DR)

  • 仔细考虑构建/编辑JobData,否则会导致触发未来工作的问题。
  • 启用“quartz.jobStore.useProperties”配置参数为official documentation recommends,以最大限度地减少版本问题。稍后使用 JobDataMap.PutAsString()

详细

但是,文档中也说明了这一点,但并未如此突出显示,但如果是这样,可能会导致严重的维护问题。你删除了你的app的下一个版本中的一些参数:

  

如果您使用持久性JobStore(在本教程的JobStore部分中讨论过),您应该谨慎地决定放置在JobDataMap中的内容,因为其中的对象将被序列化,因此它们变得容易上课 - 版本问题。

还有关于配置relevant document中提到的JobStore的相关说明:

  

“quartz.jobStore.useProperties”配置参数可以设置为“true”(默认为false),以指示AdoJobStore JobDataMaps中的所有值都是字符串,因此可以存储为名称 - 值对,而不是在BLOB列中以序列化形式存储更复杂的对象。从长远来看,这样更安全,因为您可以避免将非String类序列化为BLOB时出现的类版本问题。