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.这些星号由左到右按顺序代表 : * * * * * * * ...
随机推荐
- centos7 下安装eclipse
1 在下面路径下载 eclipse-jee-neon-2-linux-gtk-x86_64.tar.gzhttp://eclipse.stu.edu.tw/technology/epp/downloa ...
- thinkphp 多表事务处理
try{ $this->user = D('User'); $this->user->startTrans(); //开始事务 $res = $this->user->S ...
- eclipse修改端口启动多个tomcat
参考:https://blog.csdn.net/zl544434558/article/details/47857343 在一个eclipse启动多个tomcat,修改tomcat的端口是不可以的, ...
- Luogu-4022 [CTSC2012]熟悉的文章
广义后缀自动机+DP 对于作文库建出广义后缀自动机,广义自动机就是在每次添加一个字符串之前把\(last=0\),然后正常添加就好了 对于每个询问串,预处理出每个位置\(i\)能向前匹配的最长长度\( ...
- ZK服务管理中心
ZK基础类及服务的注册与发现: package top.letsgogo.util; import org.I0Itec.zkclient.ZkClient; import org.I0Itec.zk ...
- java中,return和return null有什么区别吗?
java中,return和return null有什么区别吗? 最大的区别:return;方法的返回值必须是void!return null;方法的返回值必须不是 原始数据类型(封装类除过)和void ...
- 手把手教你安装SSL证书升级https
是不是觉得别人网站前面的小绿锁很好看? 而且,Google官方也正式承认过https是影响搜索排名的一个因素,那么如何将自己的网站全面升级为https呢?今天的内容就介绍一下如何将部署在Nginx的W ...
- 关于series的统计
1.统计se中各个元素出现的次数: se.value_counts() 这个命令就非常重要!(df没有这个命令) 另外series转dict是to_dict(),注意与数组转list的tolist() ...
- 安装requests 库
这是我见过最恶心的安装了,嘛的,以为公司网络限制.我无法上网 使用 PIP INSTALL REQUESTS .本来就一句话的时 我一直安装不成功.https://www.lfd.uci.edu/~g ...
- Redis集群部署3.0
我用的Mac的终端 ------------------------- 1.Redis简介 centos(5.4) Redis是一个key-value存储系统.和Memcached类似,但是解决了断 ...