博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Hosted Services+Quartz实现定时任务调度
阅读量:6076 次
发布时间:2019-06-20

本文共 3731 字,大约阅读时间需要 12 分钟。

背景

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

1.项目启动时,要立刻恢复执行quartz.net中的任务
2.quartz.net中的Job任务无法使用ioc注入,要额外写一套
直到最近看到这篇文章,终于解决了我的问题,特此记录一下

前后代码对比

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
();}

查看详细内容

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
(options => options.UseSqlite(hostContext.Configuration.GetConnectionString("demoConnection"))); services.AddSingleton
(); services.AddSingleton(provider => { StdSchedulerFactory factory = new StdSchedulerFactory(); var scheduler = factory.GetScheduler().ConfigureAwait(false).GetAwaiter().GetResult(); scheduler.JobFactory = provider.GetService
(); return scheduler; }); // 添加自定义的HostedService services.AddHostedService
(); services.AddHostedService
(); services.AddSingleton
(); }) .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
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://www.cnblogs.com/kw13202/p/10660494.html

你可能感兴趣的文章
《HTML 5与CSS 3权威指南(第3版·下册)》——第20章 使用选择器在页面中插入内容...
查看>>
ERP项目需要的外部顾问以及评估方法
查看>>
绿色智慧城市|为什么中国城市可持续发展需要确保可步行性
查看>>
一言不合就拿1T流量的DDoS攻击勒索 怎么防?
查看>>
《Java 7程序设计入门经典》一3.2 if语句
查看>>
《规范敏捷交付:企业级敏捷软件交付的方法与实践》——导读
查看>>
英特尔代工展讯 14nm芯片本月出样
查看>>
云基础设施建设第二季度继续保持增长
查看>>
安徽省立法促进信息化健康发展 强化公众信息安全保障
查看>>
IDC:云环境中部署IT基础设施日趋流行
查看>>
并购方兴未艾,垂直型SaaS引领新热潮
查看>>
尤金·卡巴斯基:对手机发起攻击的很可能是智能微波炉
查看>>
【阿里云大学课程】机器学习入门:概念原理及常用算法
查看>>
防止公司数据外漏,数据分析公司Piwik Pro获200万美元种子轮融资
查看>>
数据中心自动化运维之路
查看>>
数据港张北数据中心启动:规模高效定制化凸显竞争优势
查看>>
Crossbar正式进入中国存储市场
查看>>
福布斯:阿里巴巴收购雅虎对大家都有利
查看>>
苹果发布iOS 10.3.1:修复Bug,提高安全性
查看>>
微软、IBM纷纷取消绩效评估,如何做员工绩效管理
查看>>