.Net Core小技巧 - Hosted Services + Quartz实现定时任务调度

背景

  之前一直有朋友问,.Net Core + Linux环境有没有类似Windows服务的东西。其实是有的,我了解的方法有两种:

  #1 创建一个ASP.Net Core的Web项目(如Web API),然后通过添加中间件(Middleware)的方式来启动任务;

  #2 创建一个.Net Core的项目,添加Host,Dependency Injection,Configuration等组件,然后通过Main方法或中间件的方式启动服务。

 

  但是,上述两种方法都有点不足,如:

  #1 会把Web的生命周期引进来,但实际上,我们并不需要Web的功能,如Controller;

  #2 本身是没有问题的,但是对开发者的要求相对高一点点,需要对.Net Core的各个组成部分都有一定的认识,简而言之,门槛有一丢丢高。

 

  .Net Core 2.1推出了一个Generic Host的概念,可以很好的解决上面两种方法的不足:

  640?wx_fmt=jpeg

  至于为什么选择Quartz来做调度,我想可能是因为情怀吧,因为之前是用的TopShelf+Quartz,其实Hangfire也不错。

 

使用Hosted Service

1. 创建一个控制台程序。

640?wx_fmt=png

 

2. 添加Host Nuget包。

640?wx_fmt=png

3. 添加一个基于Timer的简单Hosted Service(用于简单演示),继承IHostedService。

640?wx_fmt=png

4. Main函数中添加Host的相关代码。

640?wx_fmt=png

5. 查看结果

 640?wx_fmt=png

 

6. 代码解析

a. Host配置

.ConfigureHostConfiguration(configHost =>

{

  //配置根目录

  configHost.SetBasePath(Directory.GetCurrentDirectory()); 

 

  //读取host的配置json,和appsetting类似,暂不需要先注释掉,可根据需要开启

  //configHost.AddJsonFile("hostsettings.json", true, true); 

 

  //读取环境变量,Asp.Net core默认的环境变量是以ASPNETCORE_作为前缀的,这里也采用此前缀以保持一致

  configHost.AddEnvironmentVariables("ASPNETCORE_"); 

 

  //可以在启动host的时候之前可传入参数,暂不需要先注释掉,可根据需要开启

  //configHost.AddCommandLine(args);

})

 

b. App配置

.ConfigureAppConfiguration((hostContext, configApp) =>

{

  //读取应用的配置json

  configApp.AddJsonFile("appsettings.json", true); 

 

  //读取应用特定环境下的配置json

  configApp.AddJsonFile($"appsettings.{hostContext.HostingEnvironment.EnvironmentName}.json", true); 

 

  //读取环境变量

  configApp.AddEnvironmentVariables(); 

 

  //可以在启动host的时候之前可传入参数,暂不需要先注释掉,可根据需要开启

  //configApp.AddCommandLine(args);

})

 

c. 配置服务及依赖注入注册,注:没有Middleware的配置了。

.ConfigureServices((hostContext, services) =>
{

  //添加日志Service
  services.AddLogging();

 

  //添加Timer Hosted Service
  services.AddHostedService<TimedHostedService>();
})

 

 d. 日志配置

.ConfigureLogging((hostContext, configLogging) =>
{

  //输出控制台日志
  configLogging.AddConsole();

 

  //开发环境输出Debug日志
  if (hostContext.HostingEnvironment.EnvironmentName == EnvironmentName.Development)
  {
    configLogging.AddDebug();
  }
})

 

e. 使用控制台生命周期

.UseConsoleLifetime() //使用Ctrl + C退出

 

其它详细的可参考:https://docs.microsoft.com/en-us/aspnet/core/fundamentals/host/generic-host?view=aspnetcore-2.1

 

使用Quartz

1. 添加Host Nuget包。

Install-Package Quartz -Version 3.0.5Install-Package Quartz.Plugins -Version 3.0.5

 

2. Quartz配置。

之前Quartz的配置是放在quartz.config里面的,但我更喜欢使用appsettings.json,因此,把配置改成了从appsettings.json。

先建一个QuartzOption的类:

640?wx_fmt=png

3. 重写JobFactory。

640?wx_fmt=png

4. 编写Quartz Hosted Service

640?wx_fmt=png

5. 准备appsettings.json

640?wx_fmt=png

6. 编写一个TestJob

640?wx_fmt=png

7. 准备Quartz的调度文件quartz_jobs.xml

640?wx_fmt=png

8. 注册Quartz Hosted Service和TestJob

640?wx_fmt=png

9. 查看结果

640?wx_fmt=png

 

10. 补充说明。

Generic Service默认的环境是Production,如果想使用Development环境,可以在项目属性的Debug页签中添加环境变量来实现。

640?wx_fmt=png

 

 

640?wx_fmt=png

 

源码地址

https://github.com/ErikXu/.NetCoreTips/tree/master/HostedService.Quartz

 便捷使用

https://www.nuget.org/packages/Quartz.HostedService/

https://github.com/ErikXu/Quartz.HostedService

相关文章:

  • ASP.NET Core 2.1 : 十一. 如何在后台运行一个任务

原文地址: https://www.cnblogs.com/Erik_Xu/p/9219307.html


.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com

640?wx_fmt=jpeg

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/320964.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

初一模拟赛总结(4.7)

成绩&#xff1a; rank是有算其他大佬的 rankrankranknamenamenamescorescorescoreT1T1T1T2T2T2T3T3T3T4T4T4333fyfyfy230230230100100100100100100202020101010444tjhtjhtjh210210210100100100000100100100101010666wjjwjjwjj160160160100100100303030303030000777hkyhkyhky1…

P2053 SCOI2007 修车,费用流好题

修车 题目链接 https://www.luogu.org/problemnew/show/P2053 题解 每个人每次只能修一辆车,且这个人修的最后一辆车所花时间为111倍的修这辆车的时间,修倒数第iii辆车所花的时间是iii倍修这辆车所花的时间. 000号点代表源点,编号为1−M1-M1−M的点代表维修工人,0→[1,M]0 …

P4570-[BJWC2011]元素【线性基,贪心】

正题 题目链接:https://www.luogu.com.cn/problem/P4570 题目大意 给出nnn个物品有aia_iai​和bib_ibi​。要求选出一个bib_ibi​和最大的子集满足其中的aia_iai​不能由其中的其他aia_iai​异或得到 解题思路 我们发现对于一个集合能否加入一个物品其实就是判断aia_iai​是…

在.NET Core微服务中使用HostBuilder和Generic Host

基于控制台的服务中探索一个简单模式&#xff0c;以解决跨领域问题。“通用” Host和HostBuilder是随.NET Core 2.1发布而发布的新功能组件的组件。它们的一个用例是通过提供用于添加横切关注点&#xff08;例如依赖注入&#xff0c;配置和日志记录&#xff09;的模式来简化基于…

【最小环】【Floyed】观光旅游(ssl 1763)

观光旅游 ssl 1763 题目大意&#xff1a; 在一个图中找到最小环 原题&#xff1a; 题目背景 在桑给巴尔岛的Adelton城镇上有一个旅游机构。它们决定在提供许多的其它吸引之外&#xff0c;再向客人们提供旅游本镇的服务。 为了从提供的吸引服务中尽可能地获利&#xff0c;…

P2604 ZJOI2010 网络扩容,费用流裸题

网络扩容 题目链接 https://www.luogu.org/problemnew/show/P2604 题解 对于每条边u→vu \rightarrow vu→v,我们将按照容量CCC,费用000建边,这些算是免费边. 然后我们再对同一对点u,vu,vu,v建立一条容量为INFINFINF,费用为扩容费用WWW的边,这些边算是扩容流量要走的边,有费…

P3292-[SCOI2016]幸运数字【线性基,LCA,倍增】

正题 题目链接:https://www.luogu.com.cn/problem/P3292 题目大意 nnn个点的一棵树&#xff0c;每个点都点权。每次询问一条路径&#xff0c;选择若干个点的异或和最大。 解题思路 路径上的如何进行计算&#xff0c;我们知道我们可以用倍增来计算权值和。我们可以把每个线性基…

EntityFramework Core进行读写分离最佳实践方式,了解一下?

本来打算写ASP.NET Core MVC基础系列内容&#xff0c;博客评论有园友提出讲讲读写分离&#xff0c;这个问题提的好。大多数情况下&#xff0c;对于园友在评论中提出的问题&#xff0c;如果是值得深究或者大多数同行比较关注的问题我都会私下去看看&#xff0c;然后进行对应解答…

P3980 NOI2008志愿者招募

志愿者招募 题目链接 https://www.luogu.org/problemnew/show/P3980 题解 这道题很神奇,这种建图方法很有启发性. 我们平时做的题都点都是是一对一的,而这道题的点的对应关系是一对多(即一个志愿者对应一段连续的区间,也就是多个时间点)的,直接按照传统的网络流建图方法来…

小X的加法难题

小X的加法难题 题目大意&#xff1a; 一个AB的式子&#xff0c;但之间有一些没用的空格&#xff0c;要你求出结果 原题&#xff1a; 解题思路&#xff1a; 字符输入&#xff0c;有数字就存起来&#xff0c;用加号和换行符来分开 代码&#xff1a; #include<cstdio>…

P3857-[TJOI2008]彩灯【线性基】

正题 题目链接:https://www.luogu.com.cn/problem/P3857 题目大意 nnn个彩灯&#xff0c;mmm个开关能使得某些彩灯取反&#xff0c;求有多少种彩灯样式。 解题思路 其实就是mmm个数种若干个数异或起来有多少不同的数。 又是一道考线性基性质的题目&#xff0c;因为线性基中任…

【桶排】小 X 的密码破译

小 X 的密码破译 题目大意&#xff1a; 有一堆式子&#xff0c;去重再排序后&#xff0c;按规则求出结果 原题&#xff1a; 解题思路&#xff1a; 把每一个求出来的数丢到桶里&#xff0c;然后跑一遍就可以了 代码&#xff1a; #include<cstdio> using namespace s…

Uva12325 Zombie's Treasure Chest [二分区间+模拟退火]

Zombie’s Treasure Chest 题目链接 https://cn.vjudge.net/problem/UVA-12325 题意 两种物品无穷多个,第一种物品重量s1s_1s1​,价值v1v_1v1​,第二种物品重量s2s_2s2​,价值v2v_2v2​,背包重nnn,求能装的最大价值之和. 数据全都是2e92e92e9.也就是两种物品的完全背包. 题…

Identity Server 4 预备知识 -- OpenID Connect 简介

我之前的文章简单的介绍了OAuth 2.0 (在这里: 要用Identity Server 4 -- OAuth 2.0 超级简介, 还不是很全.这篇文章我要介绍一下 OpenID Connect.OAuth 2.0 不是身份认证协议OAuth 2.0 不是身份认证(Authentication)协议. 为什么有人会认为OAuth 2.0具有身份认证的功能? 这是因…

P4301-[CQOI2013]新Nim游戏【线性基】

正题 题目链接:https://www.luogu.com.cn/problem/P4301 题目大意 nnn个石头&#xff0c;先手先取走若干堆&#xff08;不能全取&#xff0c;可以不取&#xff09;&#xff0c;后手取走若干堆&#xff08;不能全取&#xff0c;可以不取&#xff09;。然后进行NimNimNim游戏&am…

P2414 NOI2011阿狸的打字机 [AC自动机,dfs序]

阿狸的打字机 题解 题目中给出的字符串就是构建TrieTrieTrie树的顺序.我们将字符串依次读入,每读入一个小写字符就相当于在TrieTrieTrie树当前节点下插入一个小写字符,读入BBB时,就在TrieTrieTrie树中向父节点移动一步.读入PPP的时候,就做一个标记. 然后对这颗TrieTrieTrie树…

Ocelot.JwtAuthorize:一个基于网关的Jwt验证包

Ocelot作为基于.net core的API网关&#xff0c;有一个功能是统一验证&#xff0c;它的作用是把没有访问权限的请求挡在API网关外面&#xff0c;而不是到达API网关事端的API时才去验证&#xff1b;之前我有一篇博文Ocelot统一权限验证&#xff0c;作过说明&#xff0c;这篇博文说…

【并查集】小 X 的液体混合

小 X 的液体混合 题目大意&#xff1a; 在一个玻璃瓶里&#xff0c;放入一些液体&#xff0c;某一对液体放在一起会有反应&#xff0c;当某个液体有反应时危险度就会乘2&#xff08;初值为1&#xff09;&#xff0c;问危险度最大是多少 原题&#xff1a; 解题思路&#xff1…

P4151-[WC2011]最大XOR和路径【线性基】

正题 题目链接:https://www.luogu.com.cn/problem/P4151 题目大意 给一个无向图&#xff0c;求一条1∼n1\sim n1∼n的路径使得异或和最大。 解题思路 很强的思路啊&#xff08;好像去年YPXYPXYPX大爷就讲了反正我也没听懂&#xff09; 我们可以将路径拆分成三部分&#xff…

Swagger如何访问Ocelot中带权限验证的API

先亮源代码&#xff1a;https://github.com/axzxs2001/Asp.NetCoreExperiment/tree/master/Asp.NetCoreExperiment/SwaggerDemo这篇博文不是对asp.net core中使用Swagger作介绍&#xff0c;因为社区博客作了详细说明。今天主要说一下Swagger在Ocelot网关权限验证模式下的访问&a…