netmajor netmajor -4 years ago 61
ASP.NET (C#) Question

Fire Job only one time at specific date and time

I have that code for Job - just log info to database

public class Job : IJob
private static readonly log4net.ILog log =
log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod( ).DeclaringType);
#region IJob Members
public void Execute(IJobExecutionContext context)
// This job simply prints out its job name and the
// date and time that it is running
JobKey jobKey = context.JobDetail.Key;
log.InfoFormat("SimpleJob says: {0} executing at {1}",
jobKey, DateTime.Now.ToString("r"));

My singleton scheduler class

public class Scheduler
static Scheduler()
NameValueCollection properties = new
properties["quartz.scheduler.instanceName"] = "myApp";
properties["quartz.scheduler.instanceId"] = "MyApp";
properties["quartz.threadPool.type"] =
"Quartz.Simpl.SimpleThreadPool, Quartz";
properties["quartz.threadPool.threadCount"] = "10";
properties["quartz.threadPool.threadPriority"] = "Normal";
properties["quartz.scheduler.instanceName"] =
properties["quartz.scheduler.instanceId"] =
properties["quartz.jobStore.type"] =
"Quartz.Impl.AdoJobStore.JobStoreTX, Quartz";
properties["quartz.jobStore.useProperties"] = "true";
properties["quartz.jobStore.dataSource"] = "default";
properties["quartz.jobStore.tablePrefix"] = "QRTZ_";
// if running MS SQL Server we need this
properties["quartz.jobStore.lockHandler.type"] =
"Quartz.Impl.AdoJobStore.UpdateLockRowSemaphore, Quartz";
properties["quartz.dataSource.default.connectionString"] =
properties["quartz.dataSource.default.provider"] =
_schedulerFactory = new StdSchedulerFactory(properties);
_scheduler = _schedulerFactory.GetScheduler();
public static IScheduler GetScheduler()
return _scheduler;
private static readonly ISchedulerFactory _schedulerFactory;
private static readonly IScheduler _scheduler;

Global.asax start scheduler

void Application_Start(object sender, EventArgs e)

And code to add jobs

DateTime SelectedDate = this.Calendar1.SelectedDate;
int hour = this.TimeSelector1.Hour;
int minute = this.TimeSelector1.Minute;
int second = this.TimeSelector1.Second;
// First we must get a reference to a scheduler
// jobs can be scheduled before sched.start() has been
// get a "nice round" time a few seconds in the
DateTimeOffset startTime = DateBuilder.DateOf(hour,
minute, second, SelectedDate.Day, SelectedDate.Month,
// job1 will only fire once at date/time "ts"
IJobDetail job = JobBuilder.Create<Job>()
.WithIdentity("job1", "group1")
ISimpleTrigger trigger =
// schedule it to run!
DateTimeOffset? ft =
Scheduler.GetScheduler().ScheduleJob(job, trigger);
log.Info(job.Key +
" will run at: " + ft);
this.Label1.Text = "Zdarzenie dodane";
catch (Exception ex)
log.Error(ex.Message, ex);

Problem is that jobs was add to db, but it fire immediately, not at
specific time by me :/ I use latest library Quartz.NET 2.0 beta 2
Do I something wrong in code? I begginer with this API, please help

Answer Source

Quartz.Net expects that you pass in dates and times in UTC. Try changing this line:




or, make sure that startTime is in UTC before passing it in.

Recommended from our users: Dynamic Network Monitoring from WhatsUp Gold from IPSwitch. Free Download