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

企业网站开发所需要的模块八里河风景区网站建设设计概述

企业网站开发所需要的模块,八里河风景区网站建设设计概述,内江网站seo,网络公司做机场网站.net core 实现基于 cron 表达式的任务调度Intro上次我们实现了一个简单的基于 Timer 的定时任务#xff0c;详细信息可以看这篇文章 。但是使用过程中慢慢发现这种方式可能并不太合适#xff0c;有些任务可能只希望在某个时间段内执行#xff0c;只使用 timer 就显得不是那… .net core 实现基于 cron 表达式的任务调度Intro上次我们实现了一个简单的基于 Timer 的定时任务详细信息可以看这篇文章 。但是使用过程中慢慢发现这种方式可能并不太合适有些任务可能只希望在某个时间段内执行只使用 timer 就显得不是那么灵活了希望可以像 quartz 那样指定一个 cron 表达式来指定任务的执行时间。cron 表达式介绍cron 常见于Unix和类Unix的操作系统之中用于设置周期性被执行的指令。该命令从标准输入设备读取指令并将其存放于“crontab”文件中以供之后读取和执行。该词来源于希腊语 chronosχρόνος原意是时间。通常 crontab储存的指令被守护进程激活 crond 常常在后台运行每一分钟检查是否有预定的作业需要执行。这类作业一般称为cron jobs。cron 可以比较准确的描述周期性执行任务的执行时间标准的 cron 表达式是五位304**? 五个位置上的值分别对应 分钟/小时/日期/月份/周(day of week)现在有一些扩展有6位的也有7位的6位的表达式第一个对应的是秒7个的第一个对应是秒最后一个对应的是年份0012**? 每天中午12点 01510?** 每天 10:15 01510**? 每天 10:15 301510**?* 每天 10:15:30 01510**?2005 2005年每天 10:15详细信息可以参考http://www.quartz-scheduler.org/documentation/quartz-2.3.0/tutorials/crontrigger.html.NET Core CRON serviceCRON 解析库 使用的是 https://github.com/HangfireIO/Cronos支持五位/六位暂不支持年份的解析7位基于 BackgroundService 的 CRON 定时服务实现如下public abstract class CronScheduleServiceBase : BackgroundService { /// summary /// job cron trigger expression /// refer to: http://www.quartz-scheduler.org/documentation/quartz-2.3.0/tutorials/crontrigger.html /// /summary public abstract string CronExpression { get; } protected abstract bool ConcurrentAllowed { get; } protected readonly ILogger Logger; private readonly string JobClientsCache JobClientsHash; protected CronScheduleServiceBase(ILogger logger) { Logger logger; } protected abstract Task ProcessAsync(CancellationToken cancellationToken); protected override async Task ExecuteAsync(CancellationToken stoppingToken) { { var next CronHelper.GetNextOccurrence(CronExpression); while (!stoppingToken.IsCancellationRequested next.HasValue) { var now DateTimeOffset.UtcNow; if (now next) { if (ConcurrentAllowed) { _ ProcessAsync(stoppingToken); next CronHelper.GetNextOccurrence(CronExpression); if (next.HasValue) { Logger.LogInformation(Next at {next}, next); } } else { var machineName RedisManager.HashClient.GetOrSet(JobClientsCache, GetType().FullName, () Environment.MachineName); // try get job master if (machineName Environment.MachineName) // IsMaster { using (var locker RedisManager.GetRedLockClient(${GetType().FullName}_cronService)) { // redis 互斥锁 if (await locker.TryLockAsync()) { // 执行 job await ProcessAsync(stoppingToken); next CronHelper.GetNextOccurrence(CronExpression); if (next.HasValue) { Logger.LogInformation(Next at {next}, next); await Task.Delay(next.Value - DateTimeOffset.UtcNow, stoppingToken); } } else { Logger.LogInformation($failed to acquire lock); } } } } } else { // needed for graceful shutdown for some reason. // 1000ms so it doesnt affect calculating the next // cron occurence (lowest possible: every second) await Task.Delay(1000, stoppingToken); } } } } public override Task StopAsync(CancellationToken cancellationToken) { RedisManager.HashClient.Remove(JobClientsCache, GetType().FullName); // unregister from jobClients return base.StopAsync(cancellationToken); } }因为网站部署在多台机器上所以为了防止并发执行使用 redis 做了一些事情Job执行的时候尝试获取 redis 中 job 对应的 master 的 hostname没有的话就设置为当前机器的 hostname在 job 停止的时候也就是应用停止的时候删除 redis 中当前 job 对应的 masterjob执行的时候判断是否是 master 节点是 master 才执行job不是 master 则不执行。完整实现代码https://github.com/WeihanLi/ActivityReservation/blob/dev/ActivityReservation.Helper/Services/CronScheduleServiceBase.cs#L11定时 Job 示例:public class RemoveOverdueReservationService : CronScheduleServiceBase { private readonly IServiceProvider _serviceProvider; private readonly IConfiguration _configuration; public RemoveOverdueReservationService(ILoggerRemoveOverdueReservationService logger, IServiceProvider serviceProvider, IConfiguration configuration) : base(logger) { _serviceProvider serviceProvider; _configuration configuration; } public override string CronExpression _configuration.GetAppSetting(RemoveOverdueReservationCron) ?? 0 0 18 * * ?; protected override bool ConcurrentAllowed false; protected override async Task ProcessAsync(CancellationToken cancellationToken) { using (var scope _serviceProvider.CreateScope()) { var reservationRepo scope.ServiceProvider.GetRequiredServiceIEFRepositoryReservationDbContext, Reservation(); await reservationRepo.DeleteAsync(reservation reservation.ReservationStatus 0 (reservation.ReservationForDate DateTime.Today.AddDays(-3))); } } }完整实现代码https://github.com/WeihanLi/ActivityReservation/blob/dev/ActivityReservation.Helper/Services/RemoveOverdueReservationService.csMemo使用 redis 这种方式来决定 master 并不是特别可靠正常结束的没有什么问题最好还是用比较成熟的服务注册发现框架比较好Referencehttp://crontab.org/https://en.wikipedia.org/wiki/Cronhttp://www.quartz-scheduler.org/documentation/quartz-2.3.0/tutorials/crontrigger.htmlhttps://github.com/WeihanLi/ActivityReservation
http://wiki.neutronadmin.com/news/247664/

相关文章:

  • 毕业设计 网站建设打广告在哪里打最有效
  • 青海网站建设价格低小米发布会后多久可以买到新机
  • 做界面网站用什么语言找人做网站会不会被偷
  • 网站制作电话多少钱郑州建设局官方网站
  • html5网站后台制作彩票网站给实体店做代销
  • python做直播网站网站是如何做的好
  • 网站建设的步骤以及流程一万元做网站
  • 后台网站手机版视频怎么做万网个人网站备案查询
  • 创意品牌网站软件开发需要多少钱?
  • 上海青浦网站建设美的网站建设水平swot分析
  • 怎么知道网站谁建的wordpress截取标题
  • 巫山集团网站建设接外包网站
  • 中国企业库绍兴seo计费
  • wordpress公司网站模板电脑上做免费网站教程视频
  • 太原网站开发公司遵义网站设计公司
  • 哪些网站是专做女性护肤品如何查看网站是否被做跳转
  • 淡水网站建设哪家便宜惠安规划局建设局网站
  • 自己做网站大概需要多少钱龙岗区建设工程交易服务中心
  • asp影楼网站设计黄岛建设局网站
  • 从网站验证码谈用户体验杨浦苏州网站建设
  • 静态网站挂马个人网站可以做自媒体吗
  • 扁平化企业网源码win8风格精简化源码asp带后台企业网站网站建设能赚多少钱
  • 厦门建网站平台oa系统开发
  • php网站开发哪个培训学校好北京 网站建设 公司
  • 霸州建设局网站郑州餐饮网站建设公司排名
  • 中山营销网站建设费用群晖nas可以做网站服务器
  • index.html网站怎么做国内十大平面设计公司
  • 工作室网站建设的意义微信小程序报备系统
  • 怎样为网站做外链学生作业 制作一个网站
  • 曲靖网站开发大连 建网站