Quartz Scheduler:如何将自定义对象作为JobParameter传递?

我打算编写一个ASP.NET页面来按需触发作业。 目前,我正在使用SimpleTrigger类来触发作业,但是__Trigger类都没有在JobParameters中支持对象类型作为值,并且据我所知,在钩子下使用WCF Tcp绑定将参数传递给作业调度引擎。 我想知道如何将自定义对象(可序列化)作为作业参数传递。 谢谢你的建议!

传递Quartz作业执行时可以检索的对象有两种方法:

在数据映射中传递实例。 设置作业时,请使用以下键将实例添加到地图中:

// Create job etc... var MyClass _myInstance; statusJob.JobDataMap.Put("myKey", _myInstance); // Schedule job... 

在作业的Execute()方法中检索实例,如下所示:

 public void Execute(IJobExecutionContext context) { var dataMap = context.MergedJobDataMap; var myInstance = (MyClass)dataMap["myKey"]; 

要么

在设置作业时将实例添加到调度程序上下文中,如下所示:

  ISchedulerFactory schedFact = new StdSchedulerFactory(); _sched = schedFact.GetScheduler(); _sched.Start(); // Create job etc... var MyClass _myInstance; _sched.Context.Put("myKey", myInstance); // Schedule job... 

在作业的Execute()方法中检索实例,如下所示:

 public void Execute(IJobExecutionContext context) { var schedulerContext = context.Scheduler.Context; var myInstance = (MyClass)schedulerContext.Get("myKey"); 

在计划作业时,可以在JobDetail对象上设置JobDataMap并将其传递给调度程序, quartz.net教程中描述了一些限制。 作业可以通过以下方式访问数据:

 JobDataMap dataMap = context.JobDetail.JobDataMap; 

但是,我更喜欢通过注入作业的存储库来访问我的作业配置。

我在multithreading环境中对hillstuk的回答有意想不到的结果。 这是我使用Newtonsoft的解决方案……享受

 public void InitJob() { MyClass data = new MyClass {Foo = “Foo fighters”}; /* a unique identifier for demonstration purposes.. Use your own concoction here. */ int uniqueIdentifier = new Random().Next(int.MinValue, int.MaxValue); IJobDetail newJob = JobBuilder.Create() .UsingJobData("JobData", JsonConvert.SerializeObject(data)) .WithIdentity($"job-{uniqueIdentifier}", "main") .Build(); } /* the execute method */ public class MyAwesomeJob : IJob { public void Execute(IJobExecutionContext context) { var jobData = JsonConvert.DeserializeObject(context.JobDetail.JobDataMap.GetString("JobData")); } } /* for completeness */ public class MyClass { string Foo { get; set; } } 

您可以将您的实例/对象放在IJobDetail中。

  JobDataMap m = new JobDataMap(); m.Put("Class1", new Class1(){name="xxx"}); IJobDetail job = JobBuilder.Create() .WithIdentity("myJob", "group1") .UsingJobData(m)//class object .UsingJobData("name2", "Hello World!") .Build(); 

用法

  public void Execute(IJobExecutionContext context) { JobDataMap dataMap = context.JobDetail.JobDataMap; Class1 class1 = (Class1)dataMap.Get("Class1"); string x = class1.name; } 

我按照下面的方式传递了对象

 JobDetail job1 = JobBuilder.newJob(JobAutomation.class) .usingJobData("path", path) .withIdentity("job2", "group2").build(); CronTrigger trigger1 = TriggerBuilder.newTrigger() .withIdentity("cronTrigger2", "group2") .withSchedule(CronScheduleBuilder.cronSchedule("40 27 11 * * ?")) .build(); 

按照以下代码行获取jobdatamap

 JobDataMap dataMap = context.getJobDetail().getJobDataMap(); String path =dataMap.getString("path");