背景

之前.net core使用quartz.net时,总感觉非常变扭,百度和谷歌了N久都没解决以下问题,造成代码丑陋,非常不优雅:

1.项目启动时,要立刻恢复执行quartz.net中的任务

2.quartz.net中的Job任务无法使用ioc注入,要额外写一套

直到最近看到这篇文章.Net Core小技巧 - Hosted Services + Quartz实现定时任务调度,终于解决了我的问题,特此记录一下

前后代码对比

Program.cs

查看详细内容
public class Program
{
public static void Main(string[] args)
{
var host = CreateWebHostBuilder(args).Build(); QuartzFactory.StartSpider(); host.Run();
} public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>();
}

查看详细内容
class Program
{
static async Task Main(string[] args)
{
var host = new HostBuilder()
.ConfigureHostConfiguration(configHost =>
{
// 配置根目录
configHost.SetBasePath(Path.GetDirectoryName(typeof(Program).Assembly.Location));
// 读取环境变量,Asp.Net core默认的环境变量是以ASPNETCORE_作为前缀的,这里也采用此前缀以保持一致
configHost.AddEnvironmentVariables("ASPNETCORE_");
// 读取启动host的时候之前可传入参数
configHost.AddCommandLine(args);
})
.ConfigureAppConfiguration((hostContext, configApp) =>
{
// 读取应用的配置json
configApp.AddJsonFile("appsettings.json", true);
// 读取应用特定环境下的配置json
configApp.AddJsonFile($"appsettings.{hostContext.HostingEnvironment.EnvironmentName}.json", true);
// 读取环境变量
configApp.AddEnvironmentVariables(); })
.ConfigureServices((hostContext, services) =>
{
// 添加日志Service
services.AddLogging(); // 设置efcore连接字符串
services.AddDbContext<EFContext>(options => options.UseSqlite(hostContext.Configuration.GetConnectionString("demoConnection"))); services.AddSingleton<IJobFactory, JobFactory>();
services.AddSingleton(provider =>
{
StdSchedulerFactory factory = new StdSchedulerFactory();
var scheduler = factory.GetScheduler().ConfigureAwait(false).GetAwaiter().GetResult(); scheduler.JobFactory = provider.GetService<IJobFactory>(); return scheduler;
});
// 添加自定义的HostedService
services.AddHostedService<DBHostedService>();
services.AddHostedService<QuartzHostedService>();
services.AddSingleton<TestJob, TestJob>();
})
.ConfigureLogging((hostContext, configLogging) =>
{
// 输出控制台日志
configLogging.AddConsole();
// 输出Debug日志
configLogging.AddDebug();
})
// 使用控制台生命周期
.UseConsoleLifetime()
.Build();
await host.RunAsync();
}
}

Job

查看详细内容
public class SpiderJob : IJob
{
public async Task Execute(IJobExecutionContext context)
{
using (var ctx = new EfContext())
{
var list = await ctx.Goods.AsNoTracking().ToListAsync();
}
}
}

查看详细内容
public class TestJob : IJob
{
private readonly ILogger _logger;
private readonly IConfiguration _config;
private readonly EFContext _context; public TestJob(ILogger<TestJob> logger, IConfiguration config, EFContext context)
{
_logger = logger;
_config = config;
_context = context; } public async Task Execute(IJobExecutionContext context)
{
_logger.LogInformation(string.Format("[{0:yyyy-MM-dd hh:mm:ss:ffffff}]任务执行!", DateTime.Now)); // 读取配置
Console.WriteLine($"读取配置{ _config["test"] }"); // 读取数据库
var model = await _context.QuartInfo.FirstOrDefaultAsync();
if (model != null)
{
Console.WriteLine($"读取数据库 { model.jobName }");
}
}
}

Demo地址:https://gitee.com/kw13202/HostedServiceDemo

Hosted Services+Quartz实现定时任务调度的更多相关文章

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

    背景 之前一直有朋友问,.Net Core + Linux环境有没有类似Windows服务的东西.其实是有的,我了解的方法有两种: #1 创建一个ASP.Net Core的Web项目(如Web API ...

  2. quartz实现定时任务调度

    一. 业务需求: 实际工作中我们一般会遇到这种需求: 使用Ajax技术每隔几秒从缓存或数据库中读取一些数据, 然后再显示在页面上, 眼下有一个比較好的定时调度框架: quartz能够满足我们的需求. ...

  3. 用abp vNext快速开发Quartz.NET定时任务管理界面

    今天这篇文章我将通过实例代码带着大家一步一步通过abp vNext这个asp.net core的快速开发框架来进行Quartz.net定时任务调度的管理界面的开发.大伙最好跟着一起敲一下代码,当然源码 ...

  4. 一文揭秘定时任务调度框架quartz

    之前写过quartz或者引用过quartz的一些文章,有很多人给我发消息问quartz的相关问题, quartz 报错:java.lang.classNotFoundException quartz源 ...

  5. 项目一:第十四天 1.在realm中动态授权 2.Shiro整合ehcache 缓存realm中授权信息 3.动态展示菜单数据 4.Quartz定时任务调度框架—Spring整合javamail发送邮件 5.基于poi实现分区导出

    1 Shiro整合ehCache缓存授权信息 当需要进行权限校验时候:四种方式url拦截.注解.页面标签.代码级别,当需要验证权限会调用realm中的授权方法   Shiro框架内部整合好缓存管理器, ...

  6. Window服务基于Quartz.Net组件实现定时任务调度(二)

    前言: 在上一章中,我们通过利用控制台实现定时任务调度,已经大致了解了如何基于Quartz.Net组件实现任务,至少包括三部分:job(作业),trigger(触发器),scheduler(调度器). ...

  7. C#/.NET/.NET Core定时任务调度的方法或者组件有哪些--Timer,FluentScheduler,TaskScheduler,Gofer.NET,Coravel,Quartz.NET还是Hangfire?

    原文由Rector首发于 码友网 之 <C#/.NET/.NET Core应用程序编程中实现定时任务调度的方法或者组件有哪些,Timer,FluentScheduler,TaskSchedule ...

  8. quartz 定时任务调度管理器

    本项目使用的是spring-quartz 以下配置可以开启多个已知定时任务 <?xml version="1.0" encoding="UTF-8"?&g ...

  9. [源码分析] 定时任务调度框架 Quartz 之 故障切换

    [源码分析] 定时任务调度框架 Quartz 之 故障切换 目录 [源码分析] 定时任务调度框架 Quartz 之 故障切换 0x00 摘要 0x01 基础概念 1.1 分布式 1.1.1 功能方面 ...

随机推荐

  1. binder学习笔记(十)—— 穿越到驱动层

    Binder驱动层的代码在kernel/goldfish/drivers/staging/android下的binder.c和binder.h.Android源码是不带Linux内核的,驱动正是在这个 ...

  2. 洛谷P3178 [HAOI2015]树上操作(线段树)

    题目描述 有一棵点数为 N 的树,以点 1 为根,且树点有边权.然后有 M 个操作,分为三种:操作 1 :把某个节点 x 的点权增加 a .操作 2 :把某个节点 x 为根的子树中所有点的点权都增加 ...

  3. City Game UVALive - 3029(悬线法求最大子矩阵)

    题意:多组数据(国外题好像都这样),每次n*m矩形,F表示空地,R表示障碍 求最大子矩阵(悬线法模板) 把每个格子向上延伸的空格看做一条悬线 以le[i][j],re[i][j],up[i][j]分别 ...

  4. 洛谷P2071 座位安排

    题目背景 公元二零一四年四月十七日,小明参加了省赛,在一路上,他遇到了许多问题,请你帮他解决. 题目描述 已知车上有N排座位,有N*2个人参加省赛,每排座位只能坐两人,且每个人都有自己想坐的排数,问最 ...

  5. VS2008 生成的程序有管理员权限

    vs 2008 . 解决方案---右键属性----连接器---清单文件---UAC执行级别---设置为requireAdministrator

  6. pytorch 迁移学习[摘自官网]

    迁移学习包含两种:微调和特征提取器. 微调:对整个网络进行训练,更新所有参数 特征提取器:只对最后的输出层训练,其他层的权重保持不变 当然,二者的共性就是需要加载训练好的权重,比如在ImageNet上 ...

  7. 用C#写一个函数,在一个数组中找出随意几个值相加等于一个值 与迭代器对比

    算法!用C#写一个函数,在一个数组中找出随意几个值相加等于一个值比如,数组{1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20}  要找出那些数相加等 ...

  8. 树莓派安装开源智能家居系统 Domoticz

    前言 最近闲来无事开始折腾自己的智能家居系统,对比了几种比较流行的开源智能家居系统,觉得 Domoticz 更适合,Domoticz的官方中文文档,虽然不是很完善但还是可以参考一下.需要注意的是下文用 ...

  9. Python入门字符编码

    计算机基础知识 一.应用程序任何操作硬件的请求都需要向操作系统发起系统调用,然后由操作系统去操作硬件 二.文本编辑器存取文件的原理 1.打开编辑器就打开了启动了一个进程,是在内存中的,所以,用编辑器编 ...

  10. msyql操作100题

    1.1.1 开启MySQL服务 /etc/init.d/mysqld start 使用/etc/init.d/mysqld start命令启动数据库的本质就相当于执行mysqld_safe --use ...