Quartz Scheduler: How to pass custom objects as JobParameter?

后端 未结 5 1766
时光说笑
时光说笑 2020-12-06 16:28

I am planning to write a ASP.NET page to trigger the job on demand. Currently, I am using SimpleTrigger class to trigger the job but none of the __Trigger class supports obj

相关标签:
5条回答
  • 2020-12-06 17:09

    You can put your instance/object in the 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();
    

    usage

      public void Execute(IJobExecutionContext context)
            {
     JobDataMap dataMap = context.JobDetail.JobDataMap;
                Class1 class1 = (Class1)dataMap.Get("Class1");
    string x = class1.name;
    }
    
    0 讨论(0)
  • 2020-12-06 17:12

    There are two ways to pass an object that can be retrieved when a Quartz job executes:

    Pass the instance in the data map. When you set the job up, add your instance to the map with a key like this:

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

    Retrieve the instance in the job's Execute() method like this:

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

    OR

    Add the instance to the scheduler context when you set the job up, like this:

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

    Retrieve the instance in the job's Execute() method like this:

    public void Execute(IJobExecutionContext context)
            {
                var schedulerContext = context.Scheduler.Context;
                var myInstance = (MyClass)schedulerContext.Get("myKey");
    
    0 讨论(0)
  • 2020-12-06 17:19

    I passed the object following way

    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();
    

    get jobdatamap by following lines of code

    JobDataMap dataMap = context.getJobDetail().getJobDataMap();
    String path =dataMap.getString("path");
    
    0 讨论(0)
  • 2020-12-06 17:24

    I was having unexpected results with hillstuk's answer above in multithreaded environments. Here's my solution using Newtonsoft… Enjoy

    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; } 
    }
    
    0 讨论(0)
  • 2020-12-06 17:25

    When you schedule a job you can set a JobDataMap on the JobDetail object and pass this to your scheduler, there are some limitations described in the quartz.net tutorial. The job can access the data via:

    JobDataMap dataMap = context.JobDetail.JobDataMap;
    

    However I prefer to access my job configuration, via an repository injected into the job.

    0 讨论(0)
提交回复
热议问题