Quartz 定时任务(含Redis)
一 定时任务基础:
MQ:Message Queue
消息队列服务器:MSMQ、ActiveMQ、Redis等
项目任务:确定邮件的发送,重置密码的发送(发送可能会很慢,而且有可能还需要重试),用消息队列把注册过程和邮件发送过程分开
二 示例:
//testMessageQueue.csProj
- namespace testMessageQueue
- {
- class Program
- {
- static void Main(string[] args)
- {
- /*
- while(true)
- {
- string email=Console.ReadLine();
- using(IRedisClient client=RedisManager.ClientManager.GetClient())
- {
- client.EnqueueItemOnList("TestEmail", email);
- }
- }
- */
- using(IRedisClient client=RedisManager.ClientManager.GetClient())
- {
- while(true)
- {
- string email = client.DequeueItemFromList("TestEmail");
- if(email==null)
- {
- Console.WriteLine("等待输入");
- Thread.Sleep();
- continue;
- }
- Console.WriteLine("发送邮箱:eamil=" + email);
- }
- }
- Console.ReadKey();
- }
- }
- public class RedisManager
- {
- public static PooledRedisClientManager ClientManager { get; private set; } //内部可写,外部只能读
- static RedisManager()
- {
- RedisClientManagerConfig redisConfig = new RedisClientManagerConfig();
- redisConfig.MaxWritePoolSize = ;
- redisConfig.MaxReadPoolSize = ;
- ClientManager = new PooledRedisClientManager(new string[] { "127.0.0.1" }, new string[] { "127.0.0.1" }, redisConfig); //在哪几个ip上进行集群的读写分离操作
- }
- }
- }
testMessageQueue.csProj
三 定时任务框架:
//testQuartz.csProj
- namespace testQuartz
- {
- public partial class Form1 : Form
- {
- public Form1()
- {
- InitializeComponent();
- }
- /// <summary>
- /// 定时任务
- /// </summary>
- /// <param name="sender"></param>
- /// <param name="e"></param>
- private void btnQuartz_Click(object sender, EventArgs e)
- {
- //每隔一段时间执行一个任务
- ISchedulerFactory sf = new StdSchedulerFactory();
- IScheduler sched = sf.GetScheduler(); //获得一个计划任务
- JobDetail job = new JobDetail("job1", "group1", typeof(MyJog)); ////MyJog为实现了IJob接口的类
- DateTime dt = TriggerUtils.GetNextGivenSecondDate(null, ); //5秒后开始第一次运行
- TimeSpan interval = TimeSpan.FromSeconds(); //时间段--每隔5s执行一次
- //每若干小时运行一次,小时间隔由appsettings中的IndexIntervalHour参数指定
- Trigger trigger = new SimpleTrigger("trigger1", "group1", "job1", "group1", dt, null, SimpleTrigger.RepeatIndefinitely, interval);
- sched.AddJob(job, true);
- sched.ScheduleJob(trigger);
- sched.Start();
- }
- }
- class MyJog : IJob
- {
- public void Execute(JobExecutionContext context)
- {
- MessageBox.Show("我执行了l");
- }
- }
- }
四 实例:
(1)原理:
Quartz.Net实现:每10分钟定时发送系统数据:新增用户数据
每次用户注册的时候,都把用户的注册信息:用户名、邮箱、手机号等.除了正常的注册之外,额外再把这些数据放入消息队列。
每隔5分钟,定时从消息队列中取出新注册用户信息,然后发送邮件给业务人员.
SendNewRegUserEmailJob.cs
1 直接Global不行: RupengTimer类库 //如鹏定时任务类库(因为在Global中进行会有兼容性问题)
2 Console控制台程序也不可以: Application.Run(new FormMain()); //加载WinForm时直接启动WinForm程序,因为上面是在WinForm中测试成功的
3 WinForm中执行定时任务还是不行: 因为时间(与世界标准时间是差8h) ---革零为致时间与北京(东八区)时间差8h
DateTime.Now 应该是: DateTime dt = TriggerUtils.GetNextGivenSecondDate(null, 1);
(2)逻辑:
每10分钟定时发送系统数据:新增用户数据
1 当用户邮箱被激活,更新激活状态后,获得用户数据
2 拼接用户数据的字符串 (用户名、邮箱、手机号)
3 把这个字符串 入队列集合 (Redis_Front_QueueList_AddUser)
4 执行定时任务框架 (单独RupengTimer类库与进程中,Global中有兼容性问题)
5 执行出队列任务,获得字符串
6 如果字符串不为null或长度大于0,发送邮件
(3)步骤:
//入队列 (把新增用户信息入队列)
- /// <summary>
- /// 入队列:用于存储新增用户,出队列时发送给指定邮箱
- /// </summary>
- /// <param name="context"></param>
- /// <param name="username">用户名</param>
- public static void RedisEnqueueForUserRegister(HttpContext context, string username)
- {
- #region 逻辑
- //1 当用户邮箱被激活,更新激活状态后,获得用户数据
- //2 拼接用户数据的字符串 (用户名、邮箱、手机号)
- //3 把这个字符串 入队列集合 (Redis_Front_QueueList_AddUser)
- #endregion
- #region 获得用户数据
- object obj = new MyORM_BLL().SelectModelByUserName(typeof(TD_USER), , "T", username);
- if (obj == null)
- {
- RazorHelper.RazorParse(context, "~/error.cshtml", new { Msg = "数据库错误,未找到该激活用户 username=" + username });
- context.Response.End();
- }
- TD_USER user = obj as TD_USER;
- #endregion
- StringBuilder sb = new StringBuilder();
- #region 拼接用户数据的字符串
- sb.Append("用户名:" + user.USERNAME + "|");
- sb.Append("姓名:" + user.REALNAME + "|");
- sb.Append("手机:" + user.MOBILE + "|");
- sb.AppendLine("邮箱:" + user.EMAIL + "|");
- #endregion
- using(IRedisClient client=RedisManager.ClientManager.GetClient())
- {
- client.EnqueueItemOnList(ConstStringHelper.REDIS_FRONT_QUEUELIST_ADDUSER, sb.ToString());
- }
- }
LoginHelper.RedisEnqueueForUserRegister()
//窗体加载,就执行定时任务
- namespace DIDAO.TimerForm
- {
- public partial class FormMain : Form
- {
- public FormMain()
- {
- InitializeComponent();
- }
- /// <summary>
- /// 窗体一加载,就执行定时任务
- /// </summary>
- /// <param name="sender"></param>
- /// <param name="e"></param>
- private void FormMain_Load(object sender, EventArgs e)
- {
- Timer.TimeSchedule.TimeExecuteSchedule(typeof(SendEmailForAddUser), "triggerAddUser", "groupAddUser", "jobAddUser");
- }
- }
TimerForm.FormMain.Load()
//定时任务
- namespace DIDAO.Timer
- {
- /// <summary>
- /// 定时任务
- /// </summary>
- public class TimeSchedule
- {
- /// <summary>
- /// 执行定时任务(用于类型type中的任务)
- /// </summary>
- public static void TimeExecuteSchedule(Type type, string triggerName, string groupName, string jobName)
- {
- //每隔一段时间执行一个任务
- ISchedulerFactory sf = new StdSchedulerFactory();
- IScheduler sched = sf.GetScheduler(); //获得一个计划任务
- JobDetail job = new JobDetail(jobName, groupName, type); ////MyJog为实现了IJob接口的类
- //DateTime dt = TriggerUtils.GetNextGivenSecondDate(null, 5); //5秒后开始第一次运行
- //DateTime dt = DateTime.Now; //立即执行
- DateTime dt = TriggerUtils.GetNextGivenSecondDate(null, ); //1s后开始执行
- TimeSpan interval = TimeSpan.FromMinutes(); //时间段--每隔60s执行一次
- //每若干小时运行一次,小时间隔由appsettings中的IndexIntervalHour参数指定
- Trigger trigger = new SimpleTrigger(triggerName, groupName, jobName, groupName, dt, null, SimpleTrigger.RepeatIndefinitely, interval);
- sched.AddJob(job, true);
- sched.ScheduleJob(trigger);
- sched.Start();
- }
- }
Timer.TimeSchedule.cs
//出队列 发送邮件(新注册用户信息)
- namespace DIDAO.Timer
- {
- public class SendEmailForAddUser:IJob
- {
- /// <summary>
- /// 接收方邮件地址(发送 新用户注册信息时)
- /// </summary>
- private string receiveEmailAddress = ConfigurationManager.AppSettings["receiveEmailAddress"]; //发送方邮箱地址
- /// <summary>
- /// 出队列 发送新注册用户信息
- /// </summary>
- /// <param name="context"></param>
- public void Execute(JobExecutionContext context)
- {
- #region 逻辑
- //4 执行定时任务框架 (单独RupengTimer类库与进程中,Global中有兼容性问题)
- //5 执行出队列任务,获得字符串
- //6 如果字符串不为null或长度大于0,发送邮件
- #endregion
- using(IRedisClient client=RedisManager.ClientManager.GetClient())
- {
- StringBuilder sb = new StringBuilder();
- while(true)
- {
- string item = client.DequeueItemFromList(ConstStringHelper.REDIS_FRONT_QUEUELIST_ADDUSER);
- if (item == null)
- {
- if(sb==null || sb.Length<=)
- {
- return; //执行下一次定时任务
- }
- //发送邮件
- SendEmailHelper.SendMail(receiveEmailAddress, "DIDAO邮件:新用户注册信息", sb.ToString());
- sb.Clear();
- }
- else
- {
- sb.AppendLine(item);
- }
- }
- }
- }
- }
- }
Timer.SendEmailForAddUser:IJob
Quartz 定时任务(含Redis)的更多相关文章
- springboot集成shiro集成mybatis-plus、redis、quartz定时任务
完整项目代码位于码云上,点击获取:Git地址 主要介绍一下重点配置地方: 一.application.yml文件 server: port: 8084 servlet: context-path: / ...
- Quartz定时任务学习(二)web应用/Quartz定时任务学习(三)属性文件和jar
web中使用Quartz 1.首先在web.xml文件中加入 如下内容(根据自己情况设定) 在web.xml中添加QuartzInitializerServlet,Quartz为能够在web应用中使用 ...
- quartz定时任务框架的使用
quartz定时任务时间设置 这些星号由左到右按顺序代表 : * * * * * * * ...
- Quartz定时任务学习(二)web应用
web中使用Quartz 1.首先在web.xml文件中加入 如下内容(根据自己情况设定) 在web.xml中添加QuartzInitializerServlet,Quartz为能够在web应用中使用 ...
- Quartz定时任务使用小记(11月22日)
骤然接触quartz,先从小处着手,why,what,how quartz定时任务: 为什么使用quartz定时任务,以及定时任务在实际应用场景下的特定需求. 1.用户方面的需要,为了提供更好的使用体 ...
- quartz定时任务时间配置
quartz定时任务时间设置描述(2011-03-03 16:23:50)转载▼标签: quartz时间it 分类: 凌乱小记 这些星号由左到右按顺序代表 : * * * ...
- 对quartz定时任务的初步认识
已经好久没有写技术博文了,今天就谈一谈我前两天自学的quartz定时任务吧,我对quartz定时任务的理解,就是可以设定一个时间,然后呢,在这个时间到的时候,去执行业务逻辑,这是我的简单理解,接下来看 ...
- Spring整合Quartz定时任务执行2次,Spring定时任务执行2次
Spring整合Quartz定时任务执行2次,Spring定时任务执行2次 >>>>>>>>>>>>>>>&g ...
- Quartz 定时任务时间设置
转自https://blog.csdn.net/zdx1515888659/article/details/79158169 quartz定时任务时间设置: 这些星号由左到右按顺序代表 : * * * ...
- quartz定时任务及时间设置
quartz 定时任务时间设置1.这些星号由左到右按顺序代表 : * * * * * * * ...
随机推荐
- 查看SELinux状态
查看SELinux状态:1./usr/sbin/sestatus -v ##如果SELinux status参数为enabled即为开启状态 2.getenforce ##也可以用这个命令检查 关闭S ...
- NLP-特征选择
文本分类之特征选择 1 研究背景 对于高纬度的分类问题,我们在分类之前一般会进行特征降维,特征降维的技术一般会有特征提取和特征选择.而对于文本分类问题,我们一般使用特征选择方法. 特征提取:PCA.线 ...
- R语言入门基础
教程:常用运算函数.对一般数据进行运算的常用函数: 1.round() #四舍五入 例:x <- c(3.1416, 15.377, 269.7) round(x, 0) #保留整数位 roun ...
- jedis中的一致性hash算法
[http://my.oschina.net/u/866190/blog/192286] jredis是redis的java客户端,通过sharde实现负载路由,一直很好奇jredis的sharde如 ...
- Unity3D-UGUI图集打包与动态使用(TexturePacker)
参考地址: http://blog.csdn.net/cjsen/article/details/52487706 今天做项目大佬看我在做图集,就跟我说可以用工具打包图集,也就是TexturePack ...
- MVC3 学习总结
1.项目文件结构 controllers,views 2.Model特性实现模型的客户端和服务端的验证 1)自带特性 2)扩展特性,或者重写特性 3.实现MVC filter 的类 ...
- javascript-DOM操作-留言板制作
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- APP测试的那些坑
在记录app测试走过的那些坑之前,先总结下app测试的工作主要有哪些: 1.功能测试,无论是什么软件产品,必不可少的就是功能测试.我们需要测试这款app产品的功能是否完善,是否符合客户需求,是否符 ...
- Java map简介
了解最常用的集合类型之一 Map 的基础知识以及如何针对您应用程序特有的数据优化 Map. 本文相关下载: · Jack 的 HashMap 测试· Oracle JDeveloper 10g jav ...
- centos 6 简单安装mysql
yum list installed | grep mysql yum -y remove mysql-libs.i686 yum list installed | grep mysql wget d ...