我正在尝试将 Quartz.NET 实现为 C# 中的 Windows 服务。当我期望它们触发时,我的工作没有触发......实际上,据我所知?
我的“我的工作”计划在“每分钟”之后的下一个偶数分钟开始运行。但是,当下一分钟到来时,我似乎无法判断是否有任何实际运行。
我会假设当我的作业运行时,会在作业执行时弹出一个 CLI 窗口,并且控制台操作将是可见的,(我什Console.ReadKey()
至在其中放了一个以确保窗口不会打开和关闭这么快我看不到它),但据我所知,时间表根本不执行作业。
我注意到所有时间都是 UTC 时间,并且StartTimeUtc
将设置为 UTC 时间,距离我的本地计算机时间 +6 小时,但我还假设 Quartz 调度程序通过从我的 TimeZone 设置计算执行时间来处理它,尽管我无法确认或确认我的日程安排的实际时间。
我想有一些方法可以设置 Common Logging 程序集并利用它来帮助我了解我的状态,但我还没有弄清楚如何处理它以启用任何类型的日志以获取来自我的 Windows 服务的反馈,除了从写入我为它创建的事件日志。
我的 Windows 服务的 OnStart 功能
protected override void OnStart(string[] args)
{
eventLog.WriteEntry("--- STARTING eLoyalty Scheduler Service ---");
// construct a scheduler factory
ISchedulerFactory schedFact = new StdSchedulerFactory();
// get a scheduler
IScheduler sched = schedFact.GetScheduler();
// construct job info
JobDetail jobDetail = new JobDetail("eLoyaltySchedulerService", null, typeof(PortalSchedulerJob));
jobDetail.JobDataMap["jobSays"] = "eLoyalty Scheduler Service Executing!";
jobDetail.JobDataMap["myStateData"] = new ArrayList();
// fire every minute
Trigger trigger = TriggerUtils.MakeMinutelyTrigger();
// start on the next even minute
trigger.StartTimeUtc = TriggerUtils.GetEvenMinuteDate(DateTime.UtcNow);
// name it
trigger.Name = "NextEvenMinute";
// schedule it
sched.ScheduleJob(jobDetail, trigger);
// start the schedule
sched.Start();
eventLog.WriteEntry("--- STARTED eLoyalty Scheduler Service ---");
}
我的 Job 的 Execute() 函数如下:
public void Execute(JobExecutionContext context)
{
try
{
string instName = context.JobDetail.Name;
string instGroup = context.JobDetail.Group;
JobDataMap dataMap = context.MergedJobDataMap;
string jobSays = dataMap.GetString("jobSays");
ArrayList state = (ArrayList)dataMap["myStateData"];
state.Add(DateTime.UtcNow);
Console.WriteLine("Instance {0} of PortalSchedulerJob says: {1} @ {2}", instName, jobSays, DateTime.UtcNow);
Console.ReadKey();
}
catch (JobExecutionException Ex)
{
throw Ex;
}
}
如果您能帮我弄清楚如何解决我的实际日程安排活动,我也许可以自己解决这个问题......?