背景

之前.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. 通知类型 重点: 环绕通知 (XML配置)

    前置通知:在切入点方法执行之前执行 <aop:before method="" pointcut-ref="" ></aop:before&g ...

  2. 「十二省联考 2019」异或粽子——tire树+堆

    题目 [题目描述] 小粽是一个喜欢吃粽子的好孩子.今天她在家里自己做起了粽子. 小粽面前有 $n$ 种互不相同的粽子馅儿,小粽将它们摆放为了一排,并从左至右编号为 $1$ 到 $n$.第 $i$ 种馅 ...

  3. git配置项目

    1.下载安装完git 2.在git oschina上发布项目 3.管理-公匙管理 4.git上面生成公匙 $ cat ~/.ssh/id_rsa.pub 5.将公匙复制进 git oschina 管理 ...

  4. arcgis打印服务

    <script>    function print1() {        require([               "esri/map",           ...

  5. html5 语音识别 转

  6. PHP删除目录下包含某个字符串的全部文件

    //获取全部的路径 function tree(&$arr_file, $directory, $dir_name='') { $mydir = dir($directory);    whi ...

  7. javascript的最重要的特性之一:闭包的解决方案

    初始代码: for (var j = 0; j < lnglats.length; j++) { AMap.event.addListener(markers[j], 'mouseover', ...

  8. python 中文路径问题

    Python直接读取中文路径的文件时失败,可做如下处理: inpath = 'D:/work/yuanxx/在线导航/驾车导航/walk_log/20130619_172355.txt' uipath ...

  9. Codeforces-D-Diverse Garland(思维)

    You have a garland consisting of nn lamps. Each lamp is colored red, green or blue. The color of the ...

  10. ftp功能深度剖析 + 线程 031

    一 打印进度条 import time for i in range(20): # \r 回到行首打印内容 如果有同一行内容,那么就被抹掉了 n = '>'* i print('\r%s'%n, ...