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

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

  • 22
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Quartz.NET是一个开源的作业调度框架,它可以帮助我们实现定时任务和作业调度。在Quartz.NET中,我们可以通过实现IJob接口来定义一个作业,并且可以通过JobDataMap来传递参数。这篇文章将介绍如何在Quartz.NET中使用IJobExecutionContext来传递参数。 在Quartz.NET中,每次执行一个作业,都会创建一个新的JobExecutionContext对象。这个对象包含了当前作业的执行环境信息,包括作业的JobDetail信息、Trigger信息、Scheduler信息等等。除此之外,JobExecutionContext还提供了一个JobDataMap对象,用于存储传递给作业的参数。 下面是一个简单的示例,演示了如何在作业中获取JobDataMap中的值: ```csharp public class MyJob : IJob { public void Execute(IJobExecutionContext context) { JobDataMap dataMap = context.JobDetail.JobDataMap; string param1 = dataMap.GetString("param1"); int param2 = dataMap.GetInt("param2"); // 使用传递的参数执行作业逻辑 // ... } } ``` 在这个示例中,我们定义了一个作业MyJob,并实现了IJob接口。在Execute方法中,我们通过JobExecutionContext对象获取了JobDataMap,并从中获取了传递给作业的参数。接下来,我们可以使用这些参数执行作业逻辑。 除了JobDataMap之外,JobExecutionContext还提供了许多其他有用的信息,例如当前作业的执行时间、上次执行时间、下次执行时间等等。我们可以根据这些信息来编写更加复杂的作业逻辑。 总之,使用IJobExecutionContext可以方便地在Quartz.NET中传递参数,并且获取作业的执行环境信息。如果你想了解更多关于Quartz.NET的内容,可以参考Quartz.NET官方文档。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值