Hosted Services+Quartz实现定时任务调度

背景

之前.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

原文地址:https://www.cnblogs.com/kw13202/p/10660494.html

时间: 2024-07-30 13:48:58

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

.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的生命

Spring整合Quartz实现定时任务调度

一. 核心类 1. Job: 表示一个工作, 具体的业务处理都在这里. 2. JobDetail: 表示一个具体的可执行的调度程序. 3. Trigger: 用于调度参数的配置(什么时候去调用Job). 4. Scheduler: 表示一个调度容器, 容器中有一个线程池, 用来并行调度执行每个作业, 一个调度容器中可以注册多个JobDetail和Trigger. 二. 整合spring 1. 代码结构图: 2. applicationContext.xml <?xml version="1

quartz实现定时任务调度

一. 业务需求: 实际工作中我们一般会遇到这种需求: 使用Ajax技术每隔几秒从缓存或数据库中读取一些数据, 然后再显示在页面上, 眼下有一个比較好的定时调度框架: quartz能够满足我们的需求. 二. 核心类: Job: 一个接口, 它里面仅仅有一个方法void execute().我们须要运行任务就须要实现这个接口,在execute中实现我们要做的事情. JobDetail: 在Quartz每次执行Job时,都须要创建一个Job实例,所以它直接接受一个实现类以便执行时实例化,还须要一个描写

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

今天这篇文章我将通过实例代码带着大家一步一步通过abp vNext这个asp.net core的快速开发框架来进行Quartz.net定时任务调度的管理界面的开发.大伙最好跟着一起敲一下代码,当然源码我会上传到github上,有兴趣的小伙伴可以在文章底部查看源码链接. 作者:依乐祝 原文链接:https://www.cnblogs.com/yilezhu/p/10444060.html 写在前面 有几天没更新博客了,一方面因为比较忙,另一方面是因为最近在准备组织我们霸都合肥的.NET技术社区首次

windows 服务实现定时任务调度(Quartz.Net)

我们通常在一些情况下需要软件具有一个自动执行某些任务的功能,但是又不希望直接启动软件,或者每次都要手动的来启动软件,这时我们可可以考虑到windows服务了. 首先创建一个windows服务项目(详细信息请参阅:C#创建Windows Service(Windows 服务)基础教程) 在创建好的项目中点击“单击此处切换到代码视图”切换到代码 我们主要关注一下两个方法: • OnStart – 控制服务启动 • OnStop – 控制服务停止 例: 1 public partial class S

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

1 Shiro整合ehCache缓存授权信息 当需要进行权限校验时候:四种方式url拦截.注解.页面标签.代码级别,当需要验证权限会调用realm中的授权方法   Shiro框架内部整合好缓存管理器,整合ehcache环境,只需要配置即可.     <dependency> <groupId>net.sf.ehcache</groupId> <artifactId>ehcache-core</artifactId> <version>

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

之前写过quartz或者引用过quartz的一些文章,有很多人给我发消息问quartz的相关问题, quartz 报错:java.lang.classNotFoundException quartz源码分析之深刻理解job,sheduler,calendar,trigger及listener之间的关系 Quartz框架多个trigger任务执行出现漏执行的问题分析--转 quartz集群调度机制调研及源码分析---转载 分布式定时任务调度系统技术选型--转 趁着年底比较清闲,把quartz的问题

quartz 定时任务调度管理器

本项目使用的是spring-quartz 以下配置可以开启多个已知定时任务 1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns="http://www.springframework.org/schema/beans" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xmlns:ta

浅谈Quartz定时任务调度

原文:浅谈Quartz定时任务调度 一  开发概述 对于具有一定规模的大多数企业来说,存在着这样一种需求:存在某个或某些任务,需要系统定期,自动地执行,然而,对大多数企业来说,该技术的实现,却是他们面临的一大难点和挑战.  对于大部分企业来说,实现如上功能,挑战在哪里? 挑战一:如何做一个自动服务的系统? 是从0到1开发(费时费力花钱,还不一定开发成功,即使开发成功,也未必好用),还是购买第三方服务(花钱). 挑战二:如何实现复杂的"定期规则"? 对于简单的定期规则,可以借助于wind