阅读量: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实例正常被调度。以上方案仅供参考,如有其它方案,希望和大家一起分享