Quartz.NET - 乔布斯不运行?

Rim*_*mer 5 c# quartz-scheduler quartz.net

我试图在C#中将Quartz.NET实现为Windows服务.当我期望它们触发时,我的工作并没有触发......实际上,据我所知?

我的"我的工作"计划在"精确"运行后的下一个连续分钟开始运行.然而,当下一分钟到来时,我似乎无法判断是否有任何实际运行.

我会认为我的工作运行时,一个CLI窗口将弹出的作业执行,并在控制台操作将是可见的,(我甚至把Console.ReadKey()在那里,以确保窗口没有打开和关闭如此之快,我不能看它),但据我所知,时间表根本就不是在执行工作.

我注意到,所有的时间都在UTC,那StartTimeUtc将被设置为UTC时间是从我的本地计算机时间6小时,但我也将认为Quartz调度处理,通过从我区设置计算的执行时间,但我也没有办法,我知道的确认,或者确认我的日程安排设置为实际时间.

我想有一些方法来建立共同的测井组件,并利用它来帮助我知道我的身份是什么,但我还没有搞清楚如何处理做,以使日志任何形式从我的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 ---");
    }
Run Code Online (Sandbox Code Playgroud)

我的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;
        }
    }
Run Code Online (Sandbox Code Playgroud)

如果你能帮助我弄清楚如何解决我的实际计划活动,我也许能解决这个我自己......?

Kei*_*ows 9

在Quartz.NET任务中,您只能引发JobExecutionException异常: Quartz.net-第3课:

Job.Execute(..)方法最后,我们需要告知您IJob.Execute(..)方法的一些细节.允许从execute方法抛出的唯一异常类型是JobExecutionException.因此,您通常应该使用'try-catch'块来包装execute方法的全部内容.您还应该花一些时间查看JobExecutionException的文档,因为您的作业可以使用它来为调度程序提供有关如何处理异常的各种指令.

代替:

catch (JobExecutionException Ex)
{
   throw Ex;
}
Run Code Online (Sandbox Code Playgroud)

做这样的事情:

catch (Exception err)
{
    // Only allow JobExecutionException exceptions to be thrown...
    throw new Quartz.JobExecutionException(err);
}
Run Code Online (Sandbox Code Playgroud)

然后,您可以集中处理异常:

_globalJobListener = new GlobalJobListener();
sched.AddGlobalJobListener(_globalJobListener);


public class GlobalJobListener : Quartz.IJobListener
{
    public GlobalJobListener()
    {
    }

    public virtual string Name
    {
        get { return "MainJobListener"; }
    }

    public virtual void JobToBeExecuted(JobExecutionContext context)
    {       
    }

    public virtual void JobWasExecuted(JobExecutionContext inContext, JobExecutionException inException)
    {
        if (inException != null)
        {
            // Log/handle error here
        }
    }


    public virtual void JobExecutionVetoed(JobExecutionContext inContext)
    {

    }
}
Run Code Online (Sandbox Code Playgroud)


Rim*_*mer 0

感谢大家的输入...不幸的是,我无法让这些工作正常工作,但是当我将事件记录器添加到我的作业执行函数中时,我发现它按预期每分钟写入事件日志。

我猜Console.WriteLine()Console.ReadKey()func 在 Windows 服务环境中什么也不做?

注意:他们做了一些事情,但在后台作为服务运行,而不是在控制台窗口中......