【问题标题】:How to send argument to class in Quartz.Net如何在 Quartz.Net 中向类发送参数
【发布时间】:2012-12-01 04:37:33
【问题描述】:

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

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

谁能帮我在使用 Quartz.Net 时如何使用参数?

【问题讨论】:

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


    【解决方案1】:

    您可以使用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 链接已损坏
    • 其实quartz.net移动或者删除官方文档,删除链接,我觉得没有链接也可以存在
    【解决方案2】:

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

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

    【讨论】:

    • 除了UsingJobData() 只有少数值类型的重载
    【解决方案3】:

    摘要

    让我对@arsen-mkrtchyan 的帖子进行一些重要的注释,这可能会避免生产中痛苦的支持 Quartz 代码:

    问题(对于持久性 JobStore)

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

    摘要 (TL;DR)

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

    详情

    文档中也有说明,但是没有特别强调,但可能会导致大的维护问题,例如您在下一个版本的应用程序中删除了一些参数:

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

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

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

    【讨论】:

      猜你喜欢
      • 2023-03-31
      • 2021-05-05
      • 2013-06-18
      • 2019-04-24
      • 2021-12-06
      • 1970-01-01
      • 1970-01-01
      • 2016-10-28
      • 1970-01-01
      相关资源
      最近更新 更多