当前位置: 首页 > news >正文

ASP.NET Core使用Quartz部署到IIS资源自动被回收解决方案

iis自动回收的原因

  • 回收机制默认配置,间隔时间是1740分钟,意思是:默认情况下每1740分钟(29小时)回收一次,定期检查应用程序池中的工作进程,并终止那些已经存在很长时间或已经使用了太多资源的工作进程
    在这里插入图片描述
  • 进程模型默认配置,闲置时间默认是20分钟,意思是:指在应用程序池中没有请求时,IIS 会将该应用程序池中的进程保持活动状态的最长时间。如果在此时间段内没有新的请求到达,IIS 将会终止应用程序池中的进程,以释放系统资源
    在这里插入图片描述

回收机制和进程配置对Quartz任务影响很大

  • 1.对于定时任务来说,闲置时间和回收间隔时间都可能会对其产生影响。如果闲置时间过短或回收间隔时间过长,可能会导致工作进程被终止,从而导致定时任务未能正常执行。
  • 2.闲置时间:在web api项目中配置的定时任务,在启动定时任务后,一旦达到闲置时间,定时任务就会被强制终止。

比如我有一个定时任务需要每天24小时每分钟都在跑的,每隔1分钟执行一次,启动任务后,过了闲置时间设置的20分钟,我的定时任务就被强制停止了。想要任务从新执行,就必须重新启动任务。

方案1,ASP.NET Core 中配置心跳机制

  • 在项目中创建心跳端点
// Program.cs 或 Minimal API
app.MapGet("/heartbeat", () => 
{return Results.Ok(new { Status = "Alive", Timestamp = DateTime.UtcNow });
});
  • 固定时间间隔设置0
    在这里插入图片描述
  • 设置回收时间
    在这里插入图片描述
  • 进程模型中,闲置超时设置0
    在这里插入图片描述
  • Windows 任务计划程序(每5分钟访问一次)
# 测试接口是否能正常访问
Invoke-WebRequest -Uri "http://localhost:89/heartbeat" -UseBasicParsing# PowerShell 命令(管理员权限运行)匿名身份验证
Register-ScheduledJob -Name "Rap-KeepAlivePing" -ScriptBlock {Invoke-WebRequest -Uri "http://localhost:89/heartbeat" -UseBasicParsing
} -Trigger (New-JobTrigger -Once -At (Get-Date) -RepetitionInterval (New-TimeSpan -Minutes 5) -RepetitionDuration ([TimeSpan]::MaxValue))# PowerShell 命令(管理员权限运行)windows身份认证,测试下来各种问题
Register-ScheduledJob -Name "Rap-KeepAlivePing" -ScriptBlock {$cred = [System.Convert]::ToBase64String([System.Text.Encoding]::ASCII.GetBytes("用户名:密码"))Invoke-WebRequest -Uri "http://localhost:89/heartbeat" `-Headers @{ Authorization = "Basic $cred" } `-UseBasicParsing
} -Trigger (New-JobTrigger -Once -At (Get-Date) -RepetitionInterval (New-TimeSpan -Minutes 5)# 验证任务是否创建
Get-ScheduledJob -Name "Rap-KeepAlivePing"# 停止任务
Unregister-ScheduledJob -Name "Rap-KeepAlivePing"# 启动任务(立即运行一次)
Start-Job -DefinitionName "Rap-KeepAlivePing"# 禁用任务
Disable-ScheduledJob -Name "Rap-KeepAlivePing"# 启用任务
Enable-ScheduledJob -Name "Rap-KeepAlivePing"# 删除任务
Unregister-ScheduledJob -Name "Rap-KeepAlivePing"# 查看任务基本信息
Get-ScheduledJob -Name "Rap-KeepAlivePing"# 查看完整任务详情
Get-ScheduledJob -Name "Rap-KeepAlivePing" | Format-List *# 查看任务执行历史记录
Get-Job -Name "Rap-KeepAlivePing" | Format-Table -AutoSize
  • 效果

我在13:25分回收,心跳在三分钟后触发,任务正常执行
在这里插入图片描述

方案2,IIS预加载特性(前提是你的web网站是匿名访问)

  • 安装“应用程序初始化”
    在这里插入图片描述

  • IIS线程池高级设置,常规->启动模式(设置为AlwayRunning)、进程模型->闲置超时(分钟)(设置为0)、回收->固定时间间隔(分钟)(设置为0),待定时间(设置定时回收时间)
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

  • 网站设置成预加载
    在这里插入图片描述
    在这里插入图片描述

  • 配置预加载地址
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

  • 效果,我分别在4.40和4.45设置回收,请求一过来,我的初始化任务就自动触发了
    在这里插入图片描述

总结

1.如果用户在iis下使用windwos登录,上面两种方法行不通。
2.身份认证在匿名的情况下,这两种解决方案可行,
3.搞这么麻烦不如果弄一个nginx做转发
4.一定要在iis下面使用windws登录和使用Quartz那程序中不要使用session和cookie了,把用户信息放到redis,把闲置超时设置0、固定时间间隔设置0

http://www.lqws.cn/news/159787.html

相关文章:

  • 【.net core】.KMZ文件解压为.KML文件并解析为GEOJSON坐标数据集。附KML处理多线(LineString)闭环问题
  • 37.第二阶段x64游戏实战-封包-寻找Socket套接字
  • 最新研究揭示云端大语言模型防护机制的成效与缺陷
  • 【.net core】天地图坐标转换为高德地图坐标(WGS84 坐标转 GCJ02 坐标)
  • SpringBoot项目移动之后无法运行
  • vue-18(使用 Vuex 插件实现高级功能)
  • 03.01、三合一
  • MyBatis-Plus深度全解:从入门到企业级实战
  • 【Elasticsearch】Elasticsearch 核心技术(二):映射
  • 力扣100题之128. 最长连续序列
  • el-tabs 切换时数据不更新的问题
  • 6月5日day45
  • 群晖NAS如何在虚拟机创建飞牛NAS
  • 基于STM32的DS18B20温度远程监测LCD1602显示
  • STL优先级队列的比较函数与大堆小堆的关系
  • LoRA:大模型高效微调的低秩之道——原理解析与技术实现
  • 代码随想录算法训练营第九天| 151.翻转字符串里的单词、55.右旋转字符串 、字符串总结
  • 25.6.5学习总结
  • day47 TensorBoard学习
  • label-studio的使用教程(导入本地路径)
  • 优化学习笔记
  • 热门消息中间件汇总
  • JAVA-springboot JUnit单元测试
  • 【Android基础回顾】五:AMS(Activity Manager Service)
  • 亚马逊AWS云服务器高效使用指南:最大限度降低成本的实战策略
  • 【二分图 染色法 BFS】B4188 [中山市赛 2024] 参数拟合|普及+
  • 力扣LeetBook数组和字符串--二维数组
  • k8s业务程序联调工具-KtConnect
  • 宠物车载安全座椅市场报告:解读行业趋势与投资前景
  • k8S 命令