一  定时任务基础:

MQ:Message Queue
消息队列服务器:MSMQ、ActiveMQ、Redis等
项目任务:确定邮件的发送,重置密码的发送(发送可能会很慢,而且有可能还需要重试),用消息队列把注册过程和邮件发送过程分开

二  示例:

//testMessageQueue.csProj

  1. namespace testMessageQueue
  2. {
  3. class Program
  4. {
  5. static void Main(string[] args)
  6. {
  7. /*
  8. while(true)
  9. {
  10. string email=Console.ReadLine();
  11. using(IRedisClient client=RedisManager.ClientManager.GetClient())
  12. {
  13. client.EnqueueItemOnList("TestEmail", email);
  14. }
  15. }
  16. */
  17.  
  18. using(IRedisClient client=RedisManager.ClientManager.GetClient())
  19. {
  20. while(true)
  21. {
  22. string email = client.DequeueItemFromList("TestEmail");
  23. if(email==null)
  24. {
  25. Console.WriteLine("等待输入");
  26. Thread.Sleep();
  27. continue;
  28. }
  29. Console.WriteLine("发送邮箱:eamil=" + email);
  30. }
  31. }
  32.  
  33. Console.ReadKey();
  34. }
  35. }
  36.  
  37. public class RedisManager
  38. {
  39. public static PooledRedisClientManager ClientManager { get; private set; } //内部可写,外部只能读
  40. static RedisManager()
  41. {
  42. RedisClientManagerConfig redisConfig = new RedisClientManagerConfig();
  43. redisConfig.MaxWritePoolSize = ;
  44. redisConfig.MaxReadPoolSize = ;
  45. ClientManager = new PooledRedisClientManager(new string[] { "127.0.0.1" }, new string[] { "127.0.0.1" }, redisConfig); //在哪几个ip上进行集群的读写分离操作
  46.  
  47. }
  48. }
  49. }

testMessageQueue.csProj

三  定时任务框架:

//testQuartz.csProj

  1. namespace testQuartz
  2. {
  3. public partial class Form1 : Form
  4. {
  5. public Form1()
  6. {
  7. InitializeComponent();
  8. }
  9.  
  10. /// <summary>
  11. /// 定时任务
  12. /// </summary>
  13. /// <param name="sender"></param>
  14. /// <param name="e"></param>
  15. private void btnQuartz_Click(object sender, EventArgs e)
  16. {
  17. //每隔一段时间执行一个任务
  18. ISchedulerFactory sf = new StdSchedulerFactory();
  19. IScheduler sched = sf.GetScheduler(); //获得一个计划任务
  20. JobDetail job = new JobDetail("job1", "group1", typeof(MyJog)); ////MyJog为实现了IJob接口的类
  21. DateTime dt = TriggerUtils.GetNextGivenSecondDate(null, ); //5秒后开始第一次运行
  22. TimeSpan interval = TimeSpan.FromSeconds(); //时间段--每隔5s执行一次
  23. //每若干小时运行一次,小时间隔由appsettings中的IndexIntervalHour参数指定
  24. Trigger trigger = new SimpleTrigger("trigger1", "group1", "job1", "group1", dt, null, SimpleTrigger.RepeatIndefinitely, interval);
  25. sched.AddJob(job, true);
  26. sched.ScheduleJob(trigger);
  27. sched.Start();
  28. }
  29.  
  30. }
  31. class MyJog : IJob
  32. {
  33. public void Execute(JobExecutionContext context)
  34. {
  35. MessageBox.Show("我执行了l");
  36. }
  37. }
  38. }

四  实例:

(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)步骤:

//入队列 (把新增用户信息入队列)

  1. /// <summary>
  2. /// 入队列:用于存储新增用户,出队列时发送给指定邮箱
  3. /// </summary>
  4. /// <param name="context"></param>
  5. /// <param name="username">用户名</param>
  6. public static void RedisEnqueueForUserRegister(HttpContext context, string username)
  7. {
  8. #region 逻辑
  9. //1 当用户邮箱被激活,更新激活状态后,获得用户数据
  10. //2 拼接用户数据的字符串 (用户名、邮箱、手机号)
  11. //3 把这个字符串 入队列集合 (Redis_Front_QueueList_AddUser)
  12. #endregion
  13. #region 获得用户数据
  14. object obj = new MyORM_BLL().SelectModelByUserName(typeof(TD_USER), , "T", username);
  15. if (obj == null)
  16. {
  17. RazorHelper.RazorParse(context, "~/error.cshtml", new { Msg = "数据库错误,未找到该激活用户 username=" + username });
  18. context.Response.End();
  19. }
  20. TD_USER user = obj as TD_USER;
  21. #endregion
  22. StringBuilder sb = new StringBuilder();
  23. #region 拼接用户数据的字符串
  24. sb.Append("用户名:" + user.USERNAME + "|");
  25. sb.Append("姓名:" + user.REALNAME + "|");
  26. sb.Append("手机:" + user.MOBILE + "|");
  27. sb.AppendLine("邮箱:" + user.EMAIL + "|");
  28. #endregion
  29. using(IRedisClient client=RedisManager.ClientManager.GetClient())
  30. {
  31. client.EnqueueItemOnList(ConstStringHelper.REDIS_FRONT_QUEUELIST_ADDUSER, sb.ToString());
  32. }
  33. }

LoginHelper.RedisEnqueueForUserRegister()

//窗体加载,就执行定时任务

  1. namespace DIDAO.TimerForm
  2. {
  3. public partial class FormMain : Form
  4. {
  5. public FormMain()
  6. {
  7. InitializeComponent();
  8. }
  9.  
  10. /// <summary>
  11. /// 窗体一加载,就执行定时任务
  12. /// </summary>
  13. /// <param name="sender"></param>
  14. /// <param name="e"></param>
  15. private void FormMain_Load(object sender, EventArgs e)
  16. {
  17. Timer.TimeSchedule.TimeExecuteSchedule(typeof(SendEmailForAddUser), "triggerAddUser", "groupAddUser", "jobAddUser");
  18.  
  19. }
  20. }

TimerForm.FormMain.Load()

//定时任务

  1. namespace DIDAO.Timer
  2. {
  3. /// <summary>
  4. /// 定时任务
  5. /// </summary>
  6. public class TimeSchedule
  7. {
  8. /// <summary>
  9. /// 执行定时任务(用于类型type中的任务)
  10. /// </summary>
  11. public static void TimeExecuteSchedule(Type type, string triggerName, string groupName, string jobName)
  12. {
  13. //每隔一段时间执行一个任务
  14. ISchedulerFactory sf = new StdSchedulerFactory();
  15. IScheduler sched = sf.GetScheduler(); //获得一个计划任务
  16. JobDetail job = new JobDetail(jobName, groupName, type); ////MyJog为实现了IJob接口的类
  17. //DateTime dt = TriggerUtils.GetNextGivenSecondDate(null, 5); //5秒后开始第一次运行
  18. //DateTime dt = DateTime.Now; //立即执行
  19. DateTime dt = TriggerUtils.GetNextGivenSecondDate(null, ); //1s后开始执行
  20. TimeSpan interval = TimeSpan.FromMinutes(); //时间段--每隔60s执行一次
  21. //每若干小时运行一次,小时间隔由appsettings中的IndexIntervalHour参数指定
  22. Trigger trigger = new SimpleTrigger(triggerName, groupName, jobName, groupName, dt, null, SimpleTrigger.RepeatIndefinitely, interval);
  23. sched.AddJob(job, true);
  24. sched.ScheduleJob(trigger);
  25. sched.Start();
  26. }
  27. }

Timer.TimeSchedule.cs

//出队列 发送邮件(新注册用户信息)

  1. namespace DIDAO.Timer
  2. {
  3. public class SendEmailForAddUser:IJob
  4. {
  5. /// <summary>
  6. /// 接收方邮件地址(发送 新用户注册信息时)
  7. /// </summary>
  8. private string receiveEmailAddress = ConfigurationManager.AppSettings["receiveEmailAddress"]; //发送方邮箱地址
  9.  
  10. /// <summary>
  11. /// 出队列 发送新注册用户信息
  12. /// </summary>
  13. /// <param name="context"></param>
  14. public void Execute(JobExecutionContext context)
  15. {
  16. #region 逻辑
  17. //4 执行定时任务框架 (单独RupengTimer类库与进程中,Global中有兼容性问题)
  18. //5 执行出队列任务,获得字符串
  19. //6 如果字符串不为null或长度大于0,发送邮件
  20. #endregion
  21. using(IRedisClient client=RedisManager.ClientManager.GetClient())
  22. {
  23. StringBuilder sb = new StringBuilder();
  24. while(true)
  25. {
  26. string item = client.DequeueItemFromList(ConstStringHelper.REDIS_FRONT_QUEUELIST_ADDUSER);
  27. if (item == null)
  28. {
  29. if(sb==null || sb.Length<=)
  30. {
  31. return; //执行下一次定时任务
  32. }
  33. //发送邮件
  34. SendEmailHelper.SendMail(receiveEmailAddress, "DIDAO邮件:新用户注册信息", sb.ToString());
  35. sb.Clear();
  36. }
  37. else
  38. {
  39. sb.AppendLine(item);
  40. }
  41. }
  42. }
  43.  
  44. }
  45. }
  46. }

Timer.SendEmailForAddUser:IJob

Quartz 定时任务(含Redis)的更多相关文章

  1. springboot集成shiro集成mybatis-plus、redis、quartz定时任务

    完整项目代码位于码云上,点击获取:Git地址 主要介绍一下重点配置地方: 一.application.yml文件 server: port: 8084 servlet: context-path: / ...

  2. Quartz定时任务学习(二)web应用/Quartz定时任务学习(三)属性文件和jar

    web中使用Quartz 1.首先在web.xml文件中加入 如下内容(根据自己情况设定) 在web.xml中添加QuartzInitializerServlet,Quartz为能够在web应用中使用 ...

  3. quartz定时任务框架的使用

    quartz定时任务时间设置 这些星号由左到右按顺序代表 :     *    *     *     *    *     *   *                                 ...

  4. Quartz定时任务学习(二)web应用

    web中使用Quartz 1.首先在web.xml文件中加入 如下内容(根据自己情况设定) 在web.xml中添加QuartzInitializerServlet,Quartz为能够在web应用中使用 ...

  5. Quartz定时任务使用小记(11月22日)

    骤然接触quartz,先从小处着手,why,what,how quartz定时任务: 为什么使用quartz定时任务,以及定时任务在实际应用场景下的特定需求. 1.用户方面的需要,为了提供更好的使用体 ...

  6. quartz定时任务时间配置

    quartz定时任务时间设置描述(2011-03-03 16:23:50)转载▼标签: quartz时间it 分类: 凌乱小记  这些星号由左到右按顺序代表 :     *    *     *    ...

  7. 对quartz定时任务的初步认识

    已经好久没有写技术博文了,今天就谈一谈我前两天自学的quartz定时任务吧,我对quartz定时任务的理解,就是可以设定一个时间,然后呢,在这个时间到的时候,去执行业务逻辑,这是我的简单理解,接下来看 ...

  8. Spring整合Quartz定时任务执行2次,Spring定时任务执行2次

    Spring整合Quartz定时任务执行2次,Spring定时任务执行2次 >>>>>>>>>>>>>>>&g ...

  9. Quartz 定时任务时间设置

    转自https://blog.csdn.net/zdx1515888659/article/details/79158169 quartz定时任务时间设置: 这些星号由左到右按顺序代表 : * * * ...

  10. quartz定时任务及时间设置

    quartz 定时任务时间设置1.这些星号由左到右按顺序代表 :     *    *     *     *    *     *   *                               ...

随机推荐

  1. 查看SELinux状态

    查看SELinux状态:1./usr/sbin/sestatus -v ##如果SELinux status参数为enabled即为开启状态 2.getenforce ##也可以用这个命令检查 关闭S ...

  2. NLP-特征选择

    文本分类之特征选择 1 研究背景 对于高纬度的分类问题,我们在分类之前一般会进行特征降维,特征降维的技术一般会有特征提取和特征选择.而对于文本分类问题,我们一般使用特征选择方法. 特征提取:PCA.线 ...

  3. R语言入门基础

    教程:常用运算函数.对一般数据进行运算的常用函数: 1.round() #四舍五入 例:x <- c(3.1416, 15.377, 269.7) round(x, 0) #保留整数位 roun ...

  4. jedis中的一致性hash算法

    [http://my.oschina.net/u/866190/blog/192286] jredis是redis的java客户端,通过sharde实现负载路由,一直很好奇jredis的sharde如 ...

  5. Unity3D-UGUI图集打包与动态使用(TexturePacker)

    参考地址: http://blog.csdn.net/cjsen/article/details/52487706 今天做项目大佬看我在做图集,就跟我说可以用工具打包图集,也就是TexturePack ...

  6. MVC3 学习总结

        1.项目文件结构 controllers,views 2.Model特性实现模型的客户端和服务端的验证   1)自带特性   2)扩展特性,或者重写特性   3.实现MVC filter 的类 ...

  7. javascript-DOM操作-留言板制作

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  8. APP测试的那些坑

    在记录app测试走过的那些坑之前,先总结下app测试的工作主要有哪些:   1.功能测试,无论是什么软件产品,必不可少的就是功能测试.我们需要测试这款app产品的功能是否完善,是否符合客户需求,是否符 ...

  9. Java map简介

    了解最常用的集合类型之一 Map 的基础知识以及如何针对您应用程序特有的数据优化 Map. 本文相关下载: · Jack 的 HashMap 测试· Oracle JDeveloper 10g jav ...

  10. centos 6  简单安装mysql

    yum list installed | grep mysql yum -y remove mysql-libs.i686 yum list installed | grep mysql wget d ...