关于Quartz.NET
Quartz.NET是一个.net平台下的开源作业调度框架,它最先是从Java平台的Quartz移植过来的。官方网站是http://quartznet.sourceforge.net/,目前最新版本为1.0.3。它可应用于WinForm程序及asp.net程序。作业调度可以理解为计划任务,例如我们工作日内每天9:00打卡,每月10号发工资,类似这种需要自动执行且无须干预的任务,Quartz.NET是最佳应用环境,它既可以满足类似每天打卡的简单应用场景,也能实现复杂作业与触发器对应,又由于它采用正则表达式的方式匹配时间间隔来定义作业调度时间,因此应用复杂时间间隔场景也相对简单。
需求分析
根据条件定时发送邮件给注册用户,是网站应用经常要使用的功能,使用web方式在大数据情况下容易出现浏览器死掉以及服务器超时响应的情形,这时使用Windows服务是相对更适合这种情况。结合Quartz.NET将对程序稳定性。
实现
这里我们使用的是Windows服务的方式来实现该应用,首先建立项目并添加Quartz.NET引用,注意这里是建立Windows服务类型项目,重合名主文件为ServicesMain.cs,现在在ServicesMain.cs中的onStart和onStop先不写代码。然后在视图中右击添加服务安装类,系统为自动建立相应的安装文件ProjectInstaller.cs。在这个文件中右键安装文件类属性,可以设置它的一些属性。
建立Quartz.NET的配置文件job.xml:
<?xml version="1.0" encoding="utf-8" ?>
<quartz xmlns="http://quartznet.sourceforge.net/JobSchedulingData" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.0" overwrite-existing-jobs="true">
<job>
<job-detail>
<name>SendMailJob</name>
<group>JobGroup</group>
<job-type>BatchSendMail.ServiceInvokeMain,BatchSendMail</job-type>
</job-detail>
<trigger>
<cron>
<name>SendMailJobTrigger</name>
<group>TriggerGroup</group>
<job-name>SendMailJob</job-name>
<job-group>JobGroup</job-group>
<start-time>2008-01-01T00:00:00</start-time>
<cron-expression>0/10 * * ? * *</cron-expression>
</cron>
</trigger>
</job>
</quartz>
关于其详细介绍,可以参考官方文档,这里需要注意的是<cron-expression>这一节,它分为6个部分,依次代表秒、分、时、日、月、年;可以使用通配符来表示,比如*代表任意值,?表示不指定特殊的值。-用来表示一个范围,如10-12用在month中表示10月到12月。我们这里的代表每天每隔10秒钟开始执行该服务。
建立发送邮件类:
public class SendMailClass { public string FromAddr {get;set; } public string FromUser { get; set; } public string Host { get; set; } public string LoginUser { get; set; } public string Password { get; set; } public string[] ToAddr { get; set; } public string Subject { get; set; } public string Body { get; set; } public bool IsBodyHtml { get; set; } public SendMailClass() { } public SendMailClass(string fromAddr, string fromUser, string host, string loginUser, string password, string[] toAddress, string strSubject, string strBody, bool isBodyHtml) { FromAddr = fromAddr; FromUser = fromUser; Host = host; LoginUser = loginUser; Password = password; ToAddr = toAddress; Subject = strSubject; Body = strBody; IsBodyHtml = isBodyHtml; } //发送邮件 public static string Send(SendMailClass mail) { SmtpClient smtpClient = new SmtpClient(); MailMessage message = new MailMessage(); string result = ""; try { MailAddress fromAddress = new MailAddress(mail.FromAddr, mail.FromUser); smtpClient.Host =mail.Host; smtpClient.Port = 25; message.From = fromAddress; foreach (string addr in mail.ToAddr) { message.To.Add(addr); } message.IsBodyHtml = mail.IsBodyHtml; message.Body = mail.Body; smtpClient.Send(message); MessageBox.Show("发送成功"); result = "1"; } catch (Exception ex) { MessageBox.Show(ex.Message); result = ex.Message; } return result; } }
可以将邮件账户统一保存在xml文件中,也可以写死在代码里。
主程序执行的代码:
public static void Start() { SendMailClass mail=new SendMailClass(); //.... SendMailClass.Send(mail); }
回到ServicesMain.cs中添加onStart()方法:
protected override void OnStart(string[] args) { ServiceBase[] ServicesToRun; ServicesToRun = new ServiceBase[] { new ServiceMain() }; ServiceBase.Run(ServicesToRun); }
然后编译项目,生成相应的exe文件,为了测试程序是否正常,我们先在自己电脑里安装这个服务器测试一下。在exe文件同目录下建立两个批处理文件用于安装和卸载服务。
安装服务.bat
C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\InstallUtil.exe GoalBatchSendMail.exe PAUSE
卸载服务.bat
@echo off C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\InstallUtil.exe -u GoalBatchSendMail.exe PAUSE
运行安装服务的批处理
打开计算机服务,看到我们新安装的服务: