使用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…

2311rust到31版本更新

1.27.1稳定版 在此修补程序前,下例在编译器内部恐慌. fn main() {let a vec!["".to_string()];a.iter().enumerate().take_while(|(_, &t)| false).collect::<Vec<_>>(); }1.27.1拒绝上述代码,并显示以下错误消息: error[E0507]: cannot move ou…

【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…

Linux 怎样通过win 远程桌面连接链接Linux后台服务器的可视化图形界面

目的概述&#xff1a;因不想后台直接操作&#xff08;操作不便&#xff09;&#xff0c;所以想到能否基于xrdp协议服务利用 win自带的远程桌面服务&#xff0c;链接到后台&#xff0c;类似于vnc的使用方式&#xff0c;涉及操作系统版本&#xff1a;win11 、 CentOS 7.4 、CentO…

openai/chatgpt的api接口,各个模型的最大输入token一览表

chatgpt的各个3.5api模型接口的最大输入量一览表&#xff1a; MODELDESCRIPTIONCONTEXT WINDOWTRAINING DATAgpt-3.5-turbo-1106Updated GPT 3.5 Turbo New The latest GPT-3.5 Turbo model with improved instruction following, JSON mode, reproducible outputs, parallel…

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…

Python OpenCV 视频抽帧处理并保存

上篇文章中基于OpenCV实现图像处理后&#xff0c;类似的&#xff0c;也可以对视频进行处理。OpenCV库可以将视频的每一帧读取出来&#xff0c;然后对每一帧图像做相应的操作&#xff0c;并保存成新的视频。 1. 读取视频&#xff0c;获取相关参数 import cv2 import numpy as…

【华为OD题库-027】代码编辑器-java

题目 某公司为了更高效的编写代码,邀请你开发一款代码编辑器程序。程序的输入为已有的代码文本和指令序列&#xff0c;程序需输出编辑后的最终文本。指针初始位置位于文本的开头。 支持的指令(X为大于等于0的整数,word为无空格的字符串): FORWARD X&#xff1a;指针向前(右)移动…

app使用

font-face{font-family:‘kaishu’; src: url(data:application/font-ttf;charsetutf-8;base64,AAEAAAASAQAABAAgRFNJR5PpVzIAAAEsAAAacEdTVUIzhvftAAAbnAAAAXBPUy8yY8pHoQAAHQwAAABWY21hcAsTB9YAAB1kAADD5GN2dCAvAiIAADhSAAAA5pmcGdt/siFHQAA5OQAAAOiZ2FzcAAXAAkAAOiIAAAAEGds…

GEE生物量和碳储量——指定研究区利用遥感影像红色波段阈值(大津法)提取森林范围

简介 森林提取是指利用遥感技术从高分辨率遥感影像中自动或半自动地提取森林分布信息的过程。传统的森林提取方法主要基于数学模型和规则,但随着深度学习技术的发展,利用卷积神经网络(CNN)进行森林提取的方法越来越受到关注。 具体的步骤如下: 1. 数据获取:获取高分辨率…

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

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

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

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