Quartz.NET是一个全功能的开源作业调度系统,可用于从最小的应用程序到大型企业系统。

直接上代码吧。。。

一、新建一个控制台项目

略过

二、安装Nuget包

  

三、创建发送邮箱辅助工具类

    static class EmailHelper
{
public static void SendEmail(Email email)
{
try
{
// 邮件类。
MailMessage mailMessage = new MailMessage(); // 发件人邮箱
mailMessage.From = new MailAddress(email.addFrom); // 收件人邮箱
mailMessage.To.Add(new MailAddress(email.addTo)); // 邮件标题。
mailMessage.Subject = email.subject; // 邮件内容。
mailMessage.Body = email.body; #region 配置客户端信息
// 客户端
SmtpClient client = new SmtpClient(); // smtp.qq.com 默认QQ邮箱
if (string.IsNullOrEmpty(email.host))
{
client.Host = "smtp.qq.com";
}
else
{
client.Host = email.host;
} // 邮件服务器端口
client.Port = ; // 使用安全加密连接。
client.EnableSsl = true;
client.UseDefaultCredentials = false; // 发件人的邮箱,自己邮箱里的生成授权码 (使用第三方发送qq邮件需要授权码)
client.Credentials = new NetworkCredential(email.addFrom, "自己的授权码");
#endregion //发送
client.Send(mailMessage); Console.WriteLine("发送成功 !");
}
catch (Exception ex)
{
Console.WriteLine(ex);
}
}
}

四、创建Job调度器

CronTrigger触发器公式参考  https://www.quartz-scheduler.net/documentation/quartz-2.x/tutorial/crontrigger.html
    public class SchedulerHelper
{
IScheduler scheduler;
ISchedulerFactory factory; public void StartScheduler(IJobDetail job = null, ITrigger trigger = null)
{
// 创建一个调度器
factory = new StdSchedulerFactory();
scheduler = factory.GetScheduler().Result;
scheduler.Start(); // 创建一个执行任务
if (job == null)
{
job = JobBuilder.Create<DemoJob>().WithIdentity("job1", "group1").Build();
} // 创建一个触发器 SimpleTrigger和CronTrigger
// 需要在给定的时间和重复次数执行一个作业,使用SimpleTrigger
// 有许多复杂的作业调度,使用CronTrigger,CronTrigger是基于Unix克隆表达式的。 // SimpleTrigger
//DateTimeOffset simpleRunTime = DateBuilder.EvenMinuteDate(DateTimeOffset.UtcNow);
//if (trigger == null)
//{
// trigger = TriggerBuilder.Create()
// .WithIdentity("trigger1", "group1")
// .StartAt(simpleRunTime)
// .Build();
//} // CronTrigger
if (trigger == null)
{
trigger = TriggerBuilder.Create()
.WithIdentity("trigger1", "group1")
.WithCronSchedule("0/10 * * * * ?") // 每10秒执行一次
.Build();
} // 将任务与触发器注册到调度器中
scheduler.ScheduleJob(job, trigger); // 执行
scheduler.Start();
} public void ShutDownScheduler()
{
// 关闭
if (scheduler != null)
{
scheduler.Shutdown(true);
}
} }

五、创建Job

  实现job的Execute方法,该方法中执行具体的操作。

class DemoJob : IJob
{
public Task Execute(IJobExecutionContext context)
{
Stopwatch sw = new Stopwatch();
sw.Start();
CheckWorkRec.CheckData();
sw.Stop();
Console.WriteLine("Stopwatch总共花费{0}ms.", sw.Elapsed.TotalMilliseconds);
return null;
}
}

  通过检查数据库,判断出异常数据,发送邮件进行提醒。

六、执行Job

    class Program
{
static void Main(string[] args)
{
Console.WriteLine("正在等待调度Job ..... ");
// 开启JOB
new SchedulerHelper().StartScheduler();
Console.ReadKey();
}
}

七、执行结果

Quartz.NET浅谈一 : 简单Job使用(定时发送QQ邮件)的更多相关文章

  1. 使用Quartz框架定时发送预警邮件

    1.  Quartz定时发送预警邮件 1.1.   需求及实现思路 定时查询库存预警信息,一旦存在库存预警的商品,则发邮件通知相关人员 1.2.   Quartz框架 Quartz是OpenSymph ...

  2. canvas浅谈 实现简单的自旋转下落

    旋转和平移是2个基础的动画效果,也是复杂动画的基础. 如果是普通的页面只要设置transform属性很容易实现平移+旋转的组合效果,达到自旋转下落的效果.因为操作的直接是动作元素本身很容易理解. 但是 ...

  3. 浅谈Java简单实现的生产者与消费者问题

    一.面对生产者和消费者的问题,首先我们得明白几点: 生产者:生产数据:消费者:消费数据.消费者在没有数据可供消费的情况下,不能消费:生产者在原数据没有被消费掉的情况下,不能生产新数据.假设,数据空间只 ...

  4. 基于springboot工程浅谈整合rabbitmq怎么样防止消息发送mq不丢失和消费mq的消息防止丢失

    本文只针对springboot整合rabbitmq的消息防丢失,话不多说,上干货.... 设置发送mq消息不丢失实现思路 执行的方案: 第一步,要对队列,消息以及交换机进行持久化操作(保存到物理磁盘中 ...

  5. 【转】.NET(C#):浅谈程序集清单资源和RESX资源 关于单元测试的思考--Asp.Net Core单元测试最佳实践 封装自己的dapper lambda扩展-设计篇 编写自己的dapper lambda扩展-使用篇 正确理解CAP定理 Quartz.NET的使用(附源码) 整理自己的.net工具库 GC的前世与今生 Visual Studio Package 插件开发之自动生

    [转].NET(C#):浅谈程序集清单资源和RESX资源   目录 程序集清单资源 RESX资源文件 使用ResourceReader和ResourceSet解析二进制资源文件 使用ResourceM ...

  6. 浅谈Spring中的Quartz配置

    浅谈Spring中的Quartz配置 2009-06-26 14:04 樊凯 博客园 字号:T | T Quartz是一个强大的企业级任务调度框架,Spring中继承并简化了Quartz,下面就看看在 ...

  7. SDUT OJ 数据结构实验之串一:KMP简单应用 && 浅谈对看毛片算法的理解

    数据结构实验之串一:KMP简单应用 Time Limit: 1000 ms Memory Limit: 65536 KiB Submit Statistic Discuss Problem Descr ...

  8. iOS 核心动画 Core Animation浅谈

    代码地址如下:http://www.demodashi.com/demo/11603.html 前记 关于实现一个iOS动画,如果简单的,我们可以直接调用UIView的代码块来实现,虽然使用UIVie ...

  9. 【Fiori系列】浅谈SAP Fiori的设计美感与发展历程

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[Fiori系列]浅谈SAP Fiori的设计美 ...

随机推荐

  1. Flutter:教你用CustomPaint画一个自定义的CircleProgressBar

    https://www.jianshu.com/p/2ea01ae02ffe Flutter:教你用CustomPaint画一个自定义的CircleProgressBar paint_page.dar ...

  2. border-radius圆角属性

    border-radius圆角 当盒子的宽高一样时,设置盒子的border-radius为50%,得到一个圆形 border-radius: 20px 30px 200px 200px; 只写一个值: ...

  3. Java 之 函数式接口

    函数式接口 一.概念 函数式接口在 java 中是指:有且仅有一个抽象方法的接口. 函数式接口,即适用于函数式编程场景的接口. 而Java中的函数式编程体现就是Lambda,所以函数式接口就是可以适用 ...

  4. UCOSIII等待多个内核对象

    内核对象 内核对象包括信号量.互斥信号量.消息队列和事件标志组 UCOSIII中允许任务同时等待多个信号量和多个消息队列 主结构体 typedef struct os_pend_data OS_PEN ...

  5. Laravel5.6---搜索查询 自带paginate()分页 get传参

    laravel的paginate()分页,如果用post传参,点击第二页时会默认使用get,就会返回原始数据了 需要把查询数据get方式也放到paginate()分页参数中 一.路由 Route::g ...

  6. 隐藏Apache版本号及版本敏感信息

    在安装软件前,我们需要隐藏软件的版本号及版本其他信息,这样就大大提高了安全指数. 只隐藏版本号: 我们在主配置文件里:httpd.conf [root@bqh- ~]# curl -i bbs.bqh ...

  7. Oracle 多表插入

    多表插入 作用:一条INSERT语句可以完成向多张表的插入任务(Multitable insert).有两种形式:insert all与insert first,准备测试环境:1.创建表T并初始化测试 ...

  8. mysql学习之基础篇07

    视图:view 在查询的时候我们经常把查询到的结果当成一张临时表来看,其实view就可以看成一张虚拟表,是表通过某种运算得到的投影 那么如何创建视图?创建视图需要指定视图的列名和列类型吗? 答:不用, ...

  9. USB Accessory 模式

    USB Accessory 模式USB附件模式允许用户连接专为Android设备设计的USB主机硬件.配件必须遵守Android配件开发套件文档中概述的Android附件协议.这使得无法充当USB主机 ...

  10. 使用LM386制作Arduino音乐播放器

    在我们的项目中添加声音或音乐总是会使其看起来更酷一些,听上去更有吸引力.特别是如果您使用的是Arduino开发板,并且有很多空余的引脚,只需要添加一个SD卡模块和一个普通的扬声器即可轻松添加音效.在本 ...