背景

  之前一直有朋友问,.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的概念,可以很好的解决上面两种方法的不足:

  

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

使用Hosted Service

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

2. 添加Host Nuget包。

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

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

5. 查看结果

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的类:

3. 重写JobFactory。

4. 编写Quartz Hosted Service

5. 准备appsettings.json

6. 编写一个TestJob

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

8. 注册Quartz Hosted Service和TestJob

9. 查看结果

10. 补充说明。

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

源码地址

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

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

  1. win7定时关机命令_电脑两个小技巧:新手设置电脑定时关机 VS 定时开机的方法详解!...

    关于电脑使用小技巧,我们之前也分享过不少,有朋友在后台问,如果用命令设置电脑的开机关机,今天李哥就跟大家来详细说说这个问题.定时关机:关于电脑定时关机可能还有很多小伙伴不知道这个功能,当然也肯定也不清 ...

  2. .Net Core小技巧 - Swagger适配虚拟目录及二级目录

    前言 随着前后端分离模式与微服务架构的出现,Web API变得越来越重要及普遍.而后出现的网关技术,使开发者更倾向于使用二级/多级目录来暴露Web API,一是暴露的端口更少,方便管理:二是在网关中可 ...

  3. .Net Core小技巧 - 使用Swagger上传文件

    前言 随着前后端分离开发模式的普及,后端人员更多是编写服务端API接口.调用接口实现文件上传是一个常见的功能,同时也需要一个选择文件上传的界面,可以编写前端界面上传,可以使用Postman.curl来 ...

  4. EF Core 小技巧:迁移已经应用到数据库,如何进行迁移回退操作?

    场景描述:项目中存在两个迁移 Teacher 和 TeachingPlan ,TeachingPlan 在 Teacher 之后创建,并且已经执行 dotnet ef database update  ...

  5. Java基于Quartz的定时任务调度服务(一)

    Quartz的基本用法 一 Quartz的简单介绍 Quartz 是 OpenSymphony 开源组织在任务调度领域的一个开源项目,完全基于 Java 实现,一个优秀的开源调度框架,其特点是:强大的 ...

  6. 10个小技巧助您写出高性能的ASP.NET Core代码

    今天这篇文章我们来聊一聊如何提升并优化ASP.NET Core应用程序的性能,本文的大部分内容来自翻译,当然中间穿插着自己的理解,希望对大家有所帮助!话不多说开始今天的主题吧! 我们都知道性能是公共网 ...

  7. 【实战 Ids4】小技巧篇:自定义登录页操作

    今天的内容很简单,1分钟就能看完,5分钟就能学会,但是却是在我们平时开发中必须要学会的一个小知识点,我就不让大家走弯路了,直接看操作. 在平时的IdentityServer4开发中呢,我们都是根据官方 ...

  8. iOS必备小技巧(非常的全)

    IOS必备小技巧 退回输入键盘   - (BOOL)textFieldShouldReturn:(id)textField{     [textField resignFirstResponder]; ...

  9. net core mysql 连接池_EF Core 小坑:DbContextPool 会引起数据库连接池连接耗尽

    EF Core 小坑:DbContextPool 会引起数据库连接池连接耗尽 发布时间:2019-02-18 22:05, 浏览次数:1152 , 标签: EF Core DbContextPool ...

最新文章

  1. TP-LINK821N无线网卡拆解分析
  2. 淡淡说说技术人员创业
  3. 67. Add Binary
  4. 史上最详细“截图”搭建Hexo博客——For Windows
  5. SAP实施不成功就像女人丰乳没效果
  6. 我国今日接连发生4起地震 震级均在3级以上
  7. mysql 开发权限_mysql权限管理
  8. Oracle触发器详细介绍
  9. 静态、动态内存分配比较
  10. hdu1247(Hat’s Words)
  11. Flask项目--发送短信验证码
  12. nextboolean()_Java Random nextBoolean()方法与示例
  13. 一起来玩树莓派--解决官方docker源安装失败的问题
  14. Testing - Codereview Checklist
  15. 【连载】【FPGA黑金开发板】Verilog HDL那些事儿--数码管电路驱动(八)
  16. python打印四种三角形
  17. linux三剑客之sed命令,linux三剑客之sed命令
  18. 成都电子地图 高清15、17、19级别 谷歌电子地图资源
  19. 基于Java毕业设计新能源汽车租赁管理系统源码+系统+mysql+lw文档+部署软件
  20. Backtrack5 bt5 VMware Tools 安装失败的解决办法

热门文章

  1. 给Web开发人员的以太坊入坑指南
  2. CenterOS x64安装serv-U
  3. js 深复制一个对象
  4. Windows导出所有计划任务方法
  5. 设置圆角、定向设置圆角-按钮等控件
  6. KVM 虚拟机自动克隆脚本
  7. Eclipse 安装配置总结(WST WTP)(转)
  8. 什么是Session?
  9. 使用.NET5、Blazor和Electron.NET构建跨平台桌面应用
  10. .NET Core TLS 协议指定被我钻了空子~~~