Quartz.Net 整合NetCore3.1,部署到IIS服务器上后台定时Job不被调度的解决方案

avatar
作者
筋斗云
阅读量:1

接上篇文章,Quartz.Net(2)——NetCore3.1整合Quartz.Net ,需要将其部署到IIS服务器上去让后台Job定时运行。引起注意的是:在任务结束后的任务监听器中的邮件并没有发出,这意味着任务实例并没有被成功调度。

经多方查证,可知IIS服务器默认设置会自动回收应用程序池,这意味着将释放内存,清除所有的资源。由于Job实例是由调度器调度运行的,当资源被回收后,调度器关闭后不会再自动打开,因此定时Job无法被调度运行。为了解决这个问题,需要对IIS服务器进行相关的配置。

  • 1 开启应用程序池启动模式(AlwaysRunning):保证应用程序池在第一次创建或者被回收后,能自动再次重启运行。
    在这里插入图片描述
  • 2 开启网站程序预加载(true):保证程序池在启动过后,ASP.NET 应用程序能自动加载。

值得注意的是, I I S 预加载的功能默认是没有安装的,所以为了配置预加载的功能需要先安装这个功能。 \textcolor{red}{值得注意的是,IIS预加载的功能默认是没有安装的,所以为了配置预加载的功能需要先安装这个功能。} 值得注意的是,IIS预加载的功能默认是没有安装的,所以为了配置预加载的功能需要先安装这个功能。

在这里插入图片描述

在这里插入图片描述

  • 3 配置预加载请求:这是因为IIS启动后,必须有一个请求发送到服务器,才会启动服务相应的配置【做这样的设定是为了保证Quartz的设定是正常的】

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

这意味着,当重启后,服务器会自动的请求http://xxxxxx:8002/Start/StartWeb 这个请求。这个方法中,仅仅只向日志中记录了一个start信息。入下:
这个预加载请求逻辑,仅做参考,如果有特殊的处理,可按照实际需求编写业务逻辑

    [ApiController]     [Route("[controller]/[action]")]     public class StartController:ControllerBase     {          private readonly ILogger<StartController> logger;          public StartController(ILogger<StartController> logger) {              this.logger = logger;         }           [HttpGet]         public void StartWeb() {             logger.LogInformation("Start");         }     } 

步骤3 的操作,同样可以直接设定web.config文件,增加以下信息

    <system.webServer>         <applicationInitialization doAppInitAfterRestart="true">             <add initializationPage="/Start/StartWeb" hostName="http:xxxxxx:8002" />         </applicationInitialization>     </system.webServer> 

IIS服务器经上述设定后,Job实例正常被调度。以上方案仅供参考,如有其它方案,希望和大家一起分享

广告一刻

为您即时展示最新活动产品广告消息,让您随时掌握产品活动新动态!