Кварцевый планировщик: как передать пользовательские объекты как JobParameter? - PullRequest
14 голосов
/ 21 августа 2011

Я планирую написать страницу ASP.NET для запуска задания по требованию. В настоящее время я использую класс SimpleTrigger для запуска задания, но ни один из класса __Trigger не поддерживает тип объекта в качестве значения в JobParameters, и мне стало известно, что привязка Tcp WCF используется под хуком для передачи параметров в механизм планирования заданий. Я хотел бы знать, как передать пользовательский объект (сериализуемый) в качестве параметров задания. Спасибо за ваш совет!

Ответы [ 5 ]

35 голосов
/ 04 сентября 2014

Существует два способа передачи объекта, который можно получить при выполнении задания 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");
4 голосов
/ 29 августа 2011

Когда вы планируете задание, вы можете установить JobDataMap для объекта JobDetail и передать его своему планировщику, есть некоторые ограничения, описанные в учебнике quartz.net .Задание может получить доступ к данным через:

JobDataMap dataMap = context.JobDetail.JobDataMap;

Однако я предпочитаю получать доступ к своей конфигурации задания через репозиторий, введенный в задание.

2 голосов
/ 28 декабря 2016

У меня были неожиданные результаты с ответом Хиллстука выше в многопоточной среде.Вот мое решение с использованием 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<MyAwesomeJob>()
    .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<MyClass>(context.JobDetail.JobDataMap.GetString("JobData"));    
    }
}

/* for completeness */
public class MyClass {
    string Foo { get; set; } 
}
1 голос
/ 16 августа 2017

Вы можете поместить свой экземпляр / объект в IJobDetail.

 JobDataMap m = new JobDataMap();
  m.Put("Class1", new Class1(){name="xxx"});


  IJobDetail job = JobBuilder.Create<Job>()
            .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;
}
0 голосов
/ 13 июня 2018

Я прошел объект следующим образом

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 dataMap = context.getJobDetail().getJobDataMap();
String path =dataMap.getString("path");
...