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
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;
}
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");
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");
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; }
}
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.