【问题标题】:Executing Quartz.NET jobs from a Windows Service从 Windows 服务执行 Quartz.NET 作业
【发布时间】:2013-05-28 16:50:58
【问题描述】:

我有一个 ASP.NET MVC 4 Web 应用程序和作为 Windows 服务运行的quartz.net,并根据这些来源配置了常用日志记录:

http://geekswithblogs.net/TarunArora/archive/2012/11/16/install-quartz.net-as-a-windows-service-and-test-installation.aspx

http://geekswithblogs.net/TarunArora/archive/2012/11/17/quartz.net-windows-service-configure-logging.aspx

并在 Global.asax 中使用此代码:

        var properties = new NameValueCollection();
        properties["quartz.scheduler.instanceName"] = "ServerScheduler";

        // set thread pool info
        properties["quartz.threadPool.type"] = "Quartz.Simpl.SimpleThreadPool, Quartz";
        properties["quartz.threadPool.threadCount"] = "5";
        properties["quartz.threadPool.threadPriority"] = "Normal";

        // set remoting expoter
        properties["quartz.scheduler.proxy"] = "true";
        properties["quartz.scheduler.proxy.address"] = "tcp://localhost:555/QuartzScheduler";
        // construct a scheduler factory
        ISchedulerFactory schedFact = new StdSchedulerFactory(properties);

        // get a scheduler
        IScheduler sched = schedFact.GetScheduler();
        sched.Start();

        IJobDetail jobDetail = JobBuilder.Create<SimpleJob>()
            .WithIdentity("simpleJob", "simpleJobs")
            .RequestRecovery()
            .Build();

        ITrigger trigger = TriggerBuilder.Create()
            .WithIdentity("simpleTrigger", "simpleTriggers")
            .StartNow()
            .WithSimpleSchedule(x => x.WithRepeatCount(4).WithIntervalInSeconds(10))
            .Build();

        sched.ScheduleJob(jobDetail, trigger);

和工作:

    public class SimpleJob : IJob
    {
        public SimpleJob()
    { 

    }

    public void Execute(IJobExecutionContext context)
    {
        Debug.WriteLine("I Executed at " + DateTime.Now.ToString());
    }
}

现在如果我运行应用程序,日志会产生 5 次类似的内容

    19:35:23 [ServerScheduler_QuartzSchedulerThread] DEBUG    Quartz.Core.QuartzSchedulerThread - Batch acquisition of 1 triggers
    19:35:23 [ServerScheduler_QuartzSchedulerThread] DEBUG Quartz.Simpl.SimpleJobFactory - Producing instance of Job 'simpleJobs.simpleJob', class=Navigate.Quartz.Jobs.SimpleJob
    19:35:23 [ServerScheduler_QuartzSchedulerThread] DEBUG Quartz.Core.QuartzSchedulerThread - Batch acquisition of 1 triggers
    19:35:23 [ServerScheduler_Worker-1] DEBUG Quartz.Core.JobRunShell - Calling Execute on job simpleJobs.simpleJob
    19:35:23 [ServerScheduler_Worker-1] DEBUG Quartz.Core.JobRunShell - Trigger instruction : NoInstruction

然后删除触发器并继续,但没有执行任何作业,也没有写入调试输出的行

如果我运行嵌入在应用程序中的调度程序,但不将 NameValueCollection 传递给 StdSchedulerFactory

    ISchedulerFactory schedFact = new StdSchedulerFactory();

一切正常,我每 10 秒输出 5 次行

    I Executed at 28.05.2013. 19:47:48
    I Executed at 28.05.2013. 19:47:58
    I Executed at 28.05.2013. 19:48:08
    I Executed at 28.05.2013. 19:48:18
    I Executed at 28.05.2013. 19:48:28

我错过了什么,为什么 Windows 服务实际上不执行代码,该服务作为本地系统运行,如果我将其更改为管理员帐户,则没有任何变化。任何帮助将不胜感激。

克里斯

【问题讨论】:

    标签: asp.net-mvc service scheduling quartz.net


    【解决方案1】:

    我认为该服务实际上可能正在执行代码,但您没有看到输出。尝试将 Debug.WriteLine() 更改为使用 Common.Logging,以便输出包含在 Quartz 用于其日志输出的同一日志中。代码示例见http://netcommon.sourceforge.net/docs/1.2.0/reference/html/logging.html

    我还查看了我们在实现中使用的代码,我发现我们没有在 .GetScheduler() 之后执行 .Start()。由于您正在使用运行 Quartz 的服务,调度程序应该已经启动,并且您应该只使用从 .GetScheduler() 返回的调度程序。尝试从您的代码中删除 .Start()。

    【讨论】:

    • 好吧,我尝试了一些更明确的方法,比如将条目添加到数据库中,但仍然没有任何反应,所以我猜不是这样?
    • 也试过在.GetScheduler()之后不调用.Start(),但是没有用
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多