使用C#插件Quartz.Net定时执行CMD任务工具2

目录

  • 创建简易控制台定时任务
    • 步骤
    • 完整程序

创建简易控制台定时任务

  • 创建winform的可以看:https://blog.csdn.net/wayhb/article/details/134279205

步骤

  1. 创建控制台程序
  • 使用vs2019
  • 新建项目,控制台程序,使用.net4.7.2
  • 项目右键(管理NuGet程序包),搜索Quartz,安装
    在这里插入图片描述
  1. 使用Quartz.Net官网示例运行程序
  • 打开官网https://www.quartz-scheduler.net/documentation/quartz-3.x/quick-start.html#trying-out-the-application,在程序入库Program.cs粘贴官网示例
//出现错误右键修复,自动添加包
using Quartz;
using Quartz.Impl;
using Quartz.Logging;
using System;
using System.Threading.Tasks;namespace ConsoleSkWork
{class Program{private static async Task Main(string[] args){LogProvider.SetCurrentLogProvider(new ConsoleLogProvider());// Grab the Scheduler instance from the FactoryStdSchedulerFactory factory = new StdSchedulerFactory();IScheduler scheduler = await factory.GetScheduler();// and start it offawait scheduler.Start();// define the job and tie it to our HelloJob classIJobDetail job = JobBuilder.Create<HelloJob>().WithIdentity("job1", "group1").Build();// Trigger the job to run now, and then repeat every 10 secondsITrigger trigger = TriggerBuilder.Create().WithIdentity("trigger1", "group1").StartNow().WithSimpleSchedule(x => x.WithIntervalInSeconds(10).RepeatForever()).Build();// Tell Quartz to schedule the job using our triggerawait scheduler.ScheduleJob(job, trigger);// some sleep to show what's happeningawait Task.Delay(TimeSpan.FromSeconds(60));// and last shut down the scheduler when you are ready to close your programawait scheduler.Shutdown();Console.WriteLine("Press any key to close the application");Console.ReadKey();}// simple log provider to get something to the console//https://www.quartz-scheduler.net/documentation/quartz-3.x/quick-start.html#trying-out-the-applicationprivate class ConsoleLogProvider : ILogProvider{public Logger GetLogger(string name){return (level, func, exception, parameters) =>{if (level >= LogLevel.Info && func != null){Console.WriteLine("[" + DateTime.Now.ToLongTimeString() + "] [" + level + "] " + func(), parameters);}return true;};}public IDisposable OpenNestedContext(string message){throw new NotImplementedException();}public IDisposable OpenMappedContext(string key, object value, bool destructure = false){throw new NotImplementedException();}}}public class HelloJob : IJob{public async Task Execute(IJobExecutionContext context){await Console.Out.WriteLineAsync("Greetings from HelloJob!");}}
}
  • 运行控制台程序
    在这里插入图片描述
    说明:
    info是日志插件输出的
    hellojob就是任务触发的
  1. 添加触发监听器
  • 触发监听器是用于监听触发器的
  • 添加触发监听器可以在任务执行前后执行其他动作,例如输出下一次该任务执行时间
  • 触发监听器官网解释:https://www.quartz-scheduler.net/documentation/quartz-3.x/tutorial/trigger-and-job-listeners.html
  • 继承触发监听器接口有4个方法需要实现
//触发器执行前
public async Task TriggerFired(ITrigger trigger, IJobExecutionContext context, CancellationToken cancellationToken = default)
{}
// 判断作业是否继续(true继续,false本次不触发)
public async Task<bool> VetoJobExecution(ITrigger trigger, IJobExecutionContext context, CancellationToken cancellationToken = default)
{}
//  触发完成
public async Task TriggerComplete(ITrigger trigger, IJobExecutionContext context, SchedulerInstruction triggerInstructionCode, CancellationToken cancellationToken = default)
{}
// 触发失败
public async Task TriggerMisfired(ITrigger trigger, CancellationToken cancellationToken = default)
{}
  • 主程序中添加触发监听器
           // 将trigger监听器注册到调度器scheduler.ListenerManager.AddTriggerListener(new CustomTriggerListener());

完整程序

  • Program.cs
using System;
using System.Threading.Tasks;using Quartz;
using Quartz.Impl;
using Quartz.Logging;namespace ConsoleApp1
{public class Program{private static async Task Main(string[] args){LogProvider.SetCurrentLogProvider(new ConsoleLogProvider());// Grab the Scheduler instance from the FactoryStdSchedulerFactory factory = new StdSchedulerFactory();IScheduler scheduler = await factory.GetScheduler();// and start it offawait scheduler.Start();// define the job and tie it to our HelloJob classIJobDetail job = JobBuilder.Create<HelloJob>().WithIdentity("job1", "group1").Build();// Trigger the job to run now, and then repeat every 10 secondsITrigger trigger = TriggerBuilder.Create().WithIdentity("trigger1", "group1").StartNow().WithSimpleSchedule(x => x.WithIntervalInSeconds(10).RepeatForever()).Build();// 将trigger监听器注册到调度器scheduler.ListenerManager.AddTriggerListener(new CustomTriggerListener());// Tell Quartz to schedule the job using our triggerawait scheduler.ScheduleJob(job, trigger);// some sleep to show what's happeningawait Task.Delay(TimeSpan.FromSeconds(60));// and last shut down the scheduler when you are ready to close your programawait scheduler.Shutdown();Console.WriteLine("Press any key to close the application");Console.ReadKey();}// simple log provider to get something to the consoleprivate class ConsoleLogProvider : ILogProvider{public Logger GetLogger(string name){return (level, func, exception, parameters) =>{if (level >= LogLevel.Info && func != null){Console.WriteLine("[" + DateTime.Now.ToLongTimeString() + "] [" + level + "] " + func(), parameters);}return true;};}public IDisposable OpenNestedContext(string message){throw new NotImplementedException();}public IDisposable OpenMappedContext(string key, object value, bool destructure = false){throw new NotImplementedException();}}}public class HelloJob : IJob{public async Task Execute(IJobExecutionContext context){//获取当前时间DateTime currentDateTime = DateTime.UtcNow;await Console.Out.WriteLineAsync("当前日期和时间:" + currentDateTime.AddHours(8));}}
}
  • CustomTriggerListener.cs
using Quartz;
using System;
using System.Threading;
using System.Threading.Tasks;namespace ConsoleApp1
{//继承监听器接口public class CustomTriggerListener : ITriggerListener{public string Name => "CustomTriggerListener";//触发器执行前public async Task TriggerFired(ITrigger trigger, IJobExecutionContext context, CancellationToken cancellationToken = default){Console.WriteLine("【*********************************************】");Console.WriteLine($"【{Name}】---【TriggerFired】-【触发】");await Task.CompletedTask;}// 判断作业是否继续(true继续,false本次不触发)public async Task<bool> VetoJobExecution(ITrigger trigger, IJobExecutionContext context, CancellationToken cancellationToken = default){Console.WriteLine($"【{Name}】---【VetoJobExecution】-【判断作业是否继续】-{true}");return await Task.FromResult(cancellationToken.IsCancellationRequested);}//  触发完成public async Task TriggerComplete(ITrigger trigger, IJobExecutionContext context, SchedulerInstruction triggerInstructionCode, CancellationToken cancellationToken = default){Console.WriteLine($"【{Name}】---【TriggerComplete】-【触发完成】");//获取下次执行日期时间UTC,将UTC时间转换成北京时间DateTimeOffset dd = (DateTimeOffset)trigger.GetNextFireTimeUtc();Console.WriteLine("【下次执行时间:】"+dd.DateTime.AddHours(8));await Task.CompletedTask;}// 触发失败public async Task TriggerMisfired(ITrigger trigger, CancellationToken cancellationToken = default){Console.WriteLine($"【{Name}】---【TriggerMisfired】【触发作业】");await Task.CompletedTask;}}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/148390.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SpringBoot项目连接linux服务器数据库两种解决方法(linux直接开放端口访问本机通过SSH协议访问,以mysql为例)

最近找个springboot脚手架重新熟悉一下springboot相关框架的东西&#xff0c;结果发现好像项目还不能直接像数据库GUI工具一样填几个SSH参数就可以了&#xff0c;于是就给他再整一下看看如何解决 linux开放3306&#xff08;可修改&#xff09;端口直接访问 此方法较为方便&am…

数学建模-图与网络模型解题方法和代码实现

本文针对以下几个方面问题进行整理&#xff1a; 最短路问题 两个指定顶点之间的最短路径任意顶点之间的最短路径 2.最小生成树问题 求最小生成树 3.网络最大流问题 源点与汇点之间的最大流基于最大流的最小费用求解 4.旅行商问题 基于哈密顿(Hamilton)圈求解旅行商线性…

MyBatis整合Spring Boot扫描Mapper相关配置

MyBatis是一款 Java 平台的优秀数据库映射框架&#xff0c;支持 XML 定义或注解&#xff0c;免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。 针对 Spring 提供 Mapper 扫描注解&#xff1a; 集成 Spring Boot 时&#xff0c;可以通过 MapperScan 注解&#xff0…

【2021集创赛】基于arm Cortex-M3处理器与深度学习加速器的实时人脸口罩检测 SoC

团队介绍 参赛单位&#xff1a;深圳大学 队伍名称&#xff1a;光之巨人队 指导老师&#xff1a;钟世达、袁涛 参赛队员&#xff1a;冯昊港、潘家豪、慕镐泽 图1 团队风采 1. 项目简介 新冠疫情席卷全球&#xff0c;有效佩戴口罩可以极大程度地减小病毒感染的风险。本项目开发…

【数据结构&C++】二叉平衡搜索树-AVL树(25)

前言 大家好吖&#xff0c;欢迎来到 YY 滴C系列 &#xff0c;热烈欢迎&#xff01; 本章主要内容面向接触过C的老铁 主要内容含&#xff1a; 欢迎订阅 YY滴C专栏&#xff01;更多干货持续更新&#xff01;以下是传送门&#xff01; 目录 一.AVL树的概念二.AVL树节点的定义(代码…

mysql练习1

-- 1.查询出部门编号为BM01的所有员工 SELECT* FROMemp e WHEREe.deptno BM01; -- 2.所有销售人员的姓名、编号和部门编号。 SELECTe.empname,e.empno,e.deptno FROMemp e WHEREe.empstation "销售人员";-- 3.找出奖金高于工资的员工。 SELECT* FROMemp2 WHE…

『Spring Boot Actuator Spring Boot Admin』 实现应用监控管理

前言 本文将会使用 Spring Boot Actuator 组件实现应用监视和管理&#xff0c;同时结合 Spring Boot Admin 对 Actuator 中的信息进行界面化展示&#xff0c;监控应用的健康状况&#xff0c;提供实时警报功能 Spring Boot Actuator 简介 官方文档&#xff1a;Production-rea…

python算法例10 整数转换为罗马数字

1. 问题描述 给定一个整数&#xff0c;将其转换为罗马数字&#xff0c;要求返回结果的取值范围为1~3999。 2. 问题示例 4→Ⅳ&#xff0c;12→Ⅻ&#xff0c;21→XⅪ&#xff0c;99→XCIX。 3. 代码实现 def int_to_roman(num):val [1000, 900, 500, 400,100, 90, 50, 40…

蓝桥杯每日一题2023.11.19

题目描述 “蓝桥杯”练习系统 (lanqiao.cn) 题目分析 首先想到的方法为dfs去寻找每一个数&#xff0c;但发现会有超时 #include<bits/stdc.h> using namespace std; const int N 2e5 10; int n, cnt, a[N]; void dfs(int dep, int sum, int start) {if(dep 4){if(s…

SpirngBoot + Vue 前后端分离开发工具代码

✅作者简介&#xff1a;大家好&#xff0c;我是Leo&#xff0c;热爱Java后端开发者&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;Leo的博客 &#x1f49e;当前专栏&#xff1a; Java从入门到精通 ✨特色专栏&#xf…

软件测试技术之地图导航的测试用例

外观测试 屏幕显示不能有花屏、黑点和闪屏&#xff0c;清晰度、亮度、颜色要正常。 检测所有按键都能起到相应作用&#xff0c;是否手感不良。 UI显示状态、颜色、清晰度、效果。 控制&#xff1a;放大&#xff0c;缩小&#xff0c;音量调节功能测试。 交叉路口查询测试&am…

HAL库STM32串口开启DMA接收数据

STM32CubeMx的配置 此博客仅仅作为记录&#xff0c;这个像是有bug一样&#xff0c;有时候好使&#xff0c;有时候不好&#xff0c;所以趁现在好使赶紧记录一下&#xff0c;很多地方用到串口接收数据&#xff0c;DMA又是一种非常好的接收方式&#xff0c;可以节约CPU的时间&…

Redis(哈希Hash和发布订阅模式)

哈希是一个字符类型字段和值的映射表。 在Redis中&#xff0c;哈希是一种数据结构&#xff0c;用于存储键值对的集合。哈希可以理解为一个键值对的集合&#xff0c;其中每个键都对应一个值。哈希在Redis中的作用主要有以下几点&#xff1a; 1. 存储对象&#xff1a;哈希可以用…

米家竞品分析

一、项目描述 1. 竞品分析描述 分析市场直接竞品和潜在竞品&#xff0c;优化产品核心结构和页面布局&#xff0c;确立产品核心功能定位。了解目标用户核心需求&#xff0c;挖掘用户魅力型需求&#xff0c;以及市场现状为产品迭代做准备。 2. 产品测试环境 二、市场 1. 行业…

AI自动直播软件,ai无人直播工具2.0支持多平台矩阵直播一键同步直播脚本内容【直播脚本+使用技术教程】

AI实景直播软件简介&#xff1a; 支持一台手机自动直播&#xff0c;支持语音和文字同时回复&#xff0c;商品自动弹窗&#xff0c;支持抖音、快手、视频号、美团平台直播&#xff0c;支持矩阵直播&#xff0c;一键同步直播脚本内容。 设备需求&#xff1a; 安卓手机&#xf…

TensorRT量化实战课YOLOv7量化:YOLOv7-QAT量化

目录 前言1. YOLOv7-QAT流程2. QAT训练流程 前言 手写 AI 推出的全新 TensorRT 模型量化实战课程&#xff0c;链接。记录下个人学习笔记&#xff0c;仅供自己参考。 该实战课程主要基于手写 AI 的 Latte 老师所出的 TensorRT下的模型量化&#xff0c;在其课程的基础上&#xff…

在做题中学习(30):字符串相加

思路&#xff1a; 相加时要转换成对应的数字&#xff0c;所以让字符数字-0 如‘9’-‘0’&#xff08;ASCII&#xff09;57-489 9110&#xff0c;会进1&#xff0c;把进位保存起来&#xff0c;只取0头插到新串里。 头插时要转换对应字符数字&#xff0c;所以让对应的数字‘…

数据结构:红黑树的插入实现(C++)

个人主页 &#xff1a; 个人主页 个人专栏 &#xff1a; 《数据结构》 《C语言》《C》《Linux》 文章目录 一、红黑树二、红黑树的插入三、代码实现总结 一、红黑树 红黑树的概念&#xff1a; 红黑树是一颗二叉搜索树&#xff0c;但在每个节点上增加一个存储位表示节点的颜色&…

深入理解栈与队列:从基本概念到高级实现

&#x1f493; 博客主页&#xff1a;江池俊的博客⏩ 收录专栏&#xff1a;数据结构探索&#x1f449;专栏推荐&#xff1a;✅cpolar ✅C语言进阶之路&#x1f4bb;代码仓库&#xff1a;江池俊的代码仓库&#x1f525;编译环境&#xff1a;Visual Studio 2022&#x1f389;欢迎大…

golang中的并发模型

并发模型 传统的编程语言&#xff08;如C、Java、Python等&#xff09;并非为并发而生的&#xff0c;因此它们面对并发的逻辑多是基于操作系统的线程。其并发的执行单元&#xff08;线程&#xff09;之间的通信利用的也是操作系统提供的线程或进程间通信的原语&#xff0c;比如…