繁体   English   中英

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

[英]How to send argument to class in 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();

抽象的

让我扩展一下 @arsen-mkrtchyan 的帖子,并附上重要的注释,这可能会避免在生产中痛苦地支持 Quartz 代码:

问题(持久性JobStore)

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

摘要(长话短说;博士)

  • 仔细考虑构建/编辑您的 JobData,否则会导致触发未来工作的问题。
  • 按照官方文档的建议启用“quartz.jobStore.useProperties”配置参数,以最大程度地减少版本控制问题。 稍后使用JobDataMap.PutAsString()

细节

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

如果您使用持久性 JobStore(在本教程的 JobStore 部分讨论),您应该谨慎决定在 JobDataMap 中放置什么,因为其中的对象将被序列化,因此它们容易出现类版本控制问题。

在相关文档中也有关于配置 JobStore 的相关说明

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM