Quartz.net 3.4 - global.asax 中的开始工作不会触发

Posted

技术标签:

【中文标题】Quartz.net 3.4 - global.asax 中的开始工作不会触发【英文标题】:Quartz.net 3.4 - starting job in global.asax doesn't fire 【发布时间】:2018-10-05 20:12:40 【问题描述】:

我正在尝试使用最新版本 (3.4) 的quartz.net 运行一个简单的工作,但是它没有启动。

Global.asax

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Web;
using System.Web.Http;

using System.Web.Mvc;
using System.Web.Optimization;
using System.Web.Routing;
using Quartz.Api.ScheduledTasks;

namespace Quartz.Api

    public class WebApiApplication : System.Web.HttpApplication
    
        protected void Application_Start()
        
            AreaRegistration.RegisterAllAreas();
            GlobalConfiguration.Configure(WebApiConfig.Register);
            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
            RouteConfig.RegisterRoutes(RouteTable.Routes);
            BundleConfig.RegisterBundles(BundleTable.Bundles);

            Task.Run(async () =>  await JobScheduler.Start(); );
        
    

作业调度器

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Web;
using Quartz.Impl;

namespace Quartz.Api.ScheduledTasks

    public class JobScheduler
    
        public static async Task Start()
        
            IScheduler scheduler = await StdSchedulerFactory.GetDefaultScheduler();
            await scheduler.Start();

            IJobDetail job = JobBuilder.Create<TestJob>().Build();

            ITrigger trigger = TriggerBuilder.Create()
                .WithDailyTimeIntervalSchedule
                (s =>
                    s.WithIntervalInSeconds(10)
                        .OnEveryDay()
                        .StartingDailyAt(TimeOfDay.HourAndMinuteOfDay(0, 0))
                )
                .Build();

            await scheduler.ScheduleJob(job, trigger);
        
    

测试作业

using System.Threading.Tasks;

namespace Quartz.Api.ScheduledTasks

    public class TestJob : IJob
    
        public async Task Execute(IJobExecutionContext context)
        
            await Task.Run(() =>
             
                 string[] lines =  "First line", "Second line", "Third line" ;
                 System.IO.File.WriteAllLines(@"C:\Users\GOWDY_N\source\repos\Quartz\Quartz.Api\ScheduledTasks.txt",
                     lines);
             );

        
    

我的作业代码中的文本文件永远不会被写入磁盘。

我怀疑我没有正确使用任务,因为我的 global.asax 中的 Application_Start() 是一个 void 方法,但我在调用堆栈中使用了 async/await 模式。

有人知道在石英 3.0 或更高版本的 global.asax 中设置我的工作的好方法吗?

【问题讨论】:

我刚刚意识到我一直在错误的文件夹中查找文本文件:(。我的代码工作正常。 【参考方案1】:
public class Startup

    public void Configuration(IAppBuilder app)
    
        ...
        ScheduledTasks.JobScheduler.Start();
        ...
    

不要写在Global.asax中,而是写在Startup.cs文件中。

【讨论】:

【参考方案2】:

如果您没有充分的理由使用 Task.Run 并且只想返回一个任务,请改用以下代码:

using System.Threading.Tasks;

namespace Quartz.Api.ScheduledTasks

    public class TestJob : IJob
    
        public Task Execute(IJobExecutionContext context)
        
            string[] lines =  "First line", "Second line", "Third line" ;
            System.IO.File.WriteAllLines(
                @"C:\Users\GOWDY_N\source\repos\Quartz\Quartz.Api\ScheduledTasks.txt",
                lines);
            return Task.CompletedTask;
        
    

【讨论】:

以上是关于Quartz.net 3.4 - global.asax 中的开始工作不会触发的主要内容,如果未能解决你的问题,请参考以下文章

Quartz.NET总结Quartz 远程调度

Quartz.Net学习笔记-简介

Quartz.NET笔记 概述

基于进程的Quartz.NET管理系统QuartzService

.Net Core中使用Quartz.Net

Quartz.NET笔记 CronTrigger