You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Quartz .NET部署至服务器后任务不执行、本地运行正常问题求助

Quartz.NET 作业服务器部署不运行排查方案

作业在服务器上不运行,本地开发版本中所有功能都可正常运行

可直接落地的排查步骤

  • 首先校验时区匹配问题:你代码中配置的Cron表达式为00 50 08 ? * TUE *,Quartz默认读取服务器本地时间解析触发规则,确认服务器时区与你本地开发环境时区是否一致。比如本地为东八区,服务器若为UTC时区,触发时间会相差8小时,自然无法按预期执行。
  • 修正IIS进程回收配置:你部署路径为IIS站点,IIS默认会在站点20分钟无外部请求时自动回收工作进程,进程销毁后Quartz调度器也会同步停止,作业自然不会触发。修改方案:
    • 打开对应应用程序池的高级设置,将「闲置超时(分钟)」调整为0
    • 开启应用程序池的「始终运行」选项
    • 安装IIS的「应用程序初始化」功能,将站点的「预加载已启用」设置为True
  • 排查作业权限问题:若你的SendEmailQualityControlJob涉及发邮件、读写本地文件、调用内部接口等操作,确认IIS应用程序池的运行身份拥有对应操作的权限,比如SMTP服务是否放行了服务器IP、相关文件目录是否给应用池身份开放了读写权限。
  • 补充作业异常日志:在SendEmailQualityControlJob的Execute方法最外层包裹try-catch,将所有异常信息写入NLog日志。很多场景是作业启动后抛出未捕获异常直接终止,表面看起来就像没有运行。
  • 验证Cron表达式有效性:可以临时将Cron表达式修改为每分钟触发一次的规则0 * * * * ?,部署到服务器后观察1-2分钟,确认作业是否能正常触发,排除Cron规则配置错误问题。
  • 确认服务器运行环境:检查服务器是否安装了和你项目版本匹配的.NET运行时,本地开发环境自带SDK可以正常运行,服务器缺少对应版本运行时可能会导致作业初始化失败,虽然主程序看起来启动正常。

你提供的相关参考信息

运行日志

NOT STARTED.
      Currently in standby mode.
      Number of jobs executed: 0
      Using thread pool 'Quartz.Simpl.DefaultThreadPool' - with 10 threads.
      Using job-store 'Quartz.Simpl.RAMJobStore' - which does not support persistence. and is not clustered.
     
    2021-09-07 08:51:30.5236||INFO|Quartz.Impl.StdSchedulerFactory|Quartz scheduler 'QuartzScheduler' initialized 
    2021-09-07 08:51:30.5236||INFO|Quartz.Impl.StdSchedulerFactory|Quartz scheduler version: 3.3.3.0 
    2021-09-07 08:51:30.5617||INFO|Quartz.ContainerConfigurationProcessor|Adding 1 jobs, 1 triggers. 
    2021-09-07 08:51:30.5617||INFO|Quartz.ContainerConfigurationProcessor|Adding job: DEFAULT.SendEmailQualityControlJob 
    2021-09-07 08:51:30.5617||DEBUG|Quartz.ContainerConfigurationProcessor|Scheduling job: DEFAULT.SendEmailQualityControlJob with trigger: DEFAULT.SendEmailQualityControlJob-trigger 
    2021-09-07 08:51:30.5874||DEBUG|Quartz.ContainerConfigurationProcessor|Rescheduling job: DEFAULT.SendEmailQualityControlJob with updated trigger: DEFAULT.SendEmailQualityControlJob-trigger 
    2021-09-07 08:51:30.5874||INFO|Quartz.Core.QuartzScheduler|Scheduler QuartzScheduler_$_NON_CLUSTERED started. 
    2021-09-07 08:51:30.9056||INFO|Microsoft.Hosting.Lifetime|Application started. Press Ctrl+C to shut down. 
    2021-09-07 08:51:30.9056||INFO|Microsoft.Hosting.Lifetime|Hosting environment: Production 
    2021-09-07 08:51:30.9196||INFO|Microsoft.Hosting.Lifetime|Content root path: C:\IISPATCH\TLC 
    2021-09-07 08:51:44.2154||INFO|AppForSellers.Areas.Identity.Pages.Account.LoginModel|Użytkownik . 

核心配置代码(C#)

Host.CreateDefaultBuilder(args)
            .ConfigureServices((hostContext, services) =>
              {
                  services.AddQuartz(q =>
                  {
                      //    q.UseMicrosoftDependencyInjectionScopedJobFactory();

                      //    // Register the job, loading the schedule from configuration
                      //    q.AddJobAndTrigger<SendEmailQualityControlJob>(hostContext.Configuration);
                      //});

                      //services.AddQuartzHostedService(q => q.WaitForJobsToComplete = true);

                      q.UseMicrosoftDependencyInjectionJobFactory();

                      // Create a "key" for the job
                      var jobKey = new JobKey("SendEmailQualityControlJob");

                      // Register the job with the DI container
                      q.AddJob<SendEmailQualityControlJob>(opts => opts.WithIdentity(jobKey));

                      // Create a trigger for the job
                      q.AddTrigger(opts => opts
                        .ForJob(jobKey) // link to the SendEmailQualityControlJob
                        .WithIdentity("SendEmailQualityControlJob-trigger") // give the trigger a unique name
                        .WithCronSchedule("00 50 08 ? * TUE *"));
                      //cronExpression: "00 08 12 ? * MON,TUE,WED,THU,FRI *"));

                  });
                  services.AddQuartzHostedService(q => q.WaitForJobsToComplete = true);
              }).ConfigureWebHostDefaults(webBuilder =>
              {
                  webBuilder.UseStartup<Startup>();


              }).UseNLog();

内容的提问来源于stack exchange,提问作者user8441630

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 18:48:03