第一步:在nuget管理中依賴quartz(還會用到log4net,autofac,entityframework,System.Net.Mail)
第二步:在global.asax中註冊
public class MvcApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
log4net.Config.XmlConfigurator.Configure();
//ioc配置(?)
var builder = new ContainerBuilder();
builder.RegisterControllers(typeof(MvcApplication).Assembly).PropertiesAutowired();//把當前程序集中的 Controller 都註冊
//獲取所有相關類庫的程序集
Assembly[] assemblies = new Assembly[] { Assembly.Load("ZSZ.Service") };
//當請求這個程序集下的接口裏面的方法時候。就會返回對應的Services類裏面的實現
builder.RegisterAssemblyTypes(assemblies)
.Where(type => !type.IsAbstract
&& typeof(IServiceSupport).IsAssignableFrom(type))
.AsImplementedInterfaces().PropertiesAutowired(); //如果一個實現類中定義了其他類型的接口屬性,會自動
//給屬性進行“注入”
//Assign:賦值
//type1.IsAssignableFrom(type2) type2是否實現了type1接口/type2是否繼承自type1
//typeof(IServiceSupport).IsAssignableFrom(type)只註冊實現了IServiceSupport的類
//避免其他無關的類註冊到AutoFac中
var container = builder.Build();
//註冊系統級別的DependencyResolver,這樣當MVC框架創建Controller等對象的時候都是管Autofac要對象。
DependencyResolver.SetResolver(new AutofacDependencyResolver(container));//!!!
startQuartz();//啓動定時任務
}
private void startQuartz()
{
IScheduler sched = new StdSchedulerFactory().GetScheduler();
//給老闆的報表開始
JobDetailImpl jdBossReport
= new JobDetailImpl("jdBossReport", typeof(BossReportJob));
IMutableTrigger triggerBossReport
= CronScheduleBuilder.DailyAtHourAndMinute(14, 26).Build();//每天14:26執行一次
triggerBossReport.Key = new TriggerKey("triggerBossReport");
sched.ScheduleJob(jdBossReport, triggerBossReport);
//給老闆的報表結束
sched.Start();
}
}
第三步:設置定時任務
//Quartz定時任務
public class BossReportJob : IJob
{
private static ILog log
= LogManager.GetLogger(typeof(BossReportJob));
public void Execute(IJobExecutionContext context)
{
log.Debug("準備收集今日新增房源數量");
try
{
string bossEmails;//老闆郵箱
string smtpServer, smtpUserName, smtpPassword, smtpEmail;
StringBuilder sbMsg = new StringBuilder();
var container = AutofacDependencyResolver.Current.ApplicationContainer;//在quartz這個單獨的線程中,因爲autofac無法幫我們自動注入屬性值,因爲得通過這樣的方式獲取接口的對象值
using (container.BeginLifetimeScope())
{
var cityService = container.Resolve<ICityService>();
var houseService = container.Resolve<IHouseService>();
var settingService = container.Resolve<ISettingService>();
bossEmails = settingService.GetValue("老闆郵箱");//讀取配置中的老闆郵箱
smtpServer = settingService.GetValue("SmtpServer");
smtpUserName = settingService.GetValue("SmtpUserName");
smtpPassword = settingService.GetValue("SmtpPassword");//密碼或者授權碼
smtpEmail = settingService.GetValue("SmtpEmail");
foreach (var city in cityService.GetAllCity())
{
long count = houseService.GetTodayNewHouseCount(city.Id);
sbMsg.Append(city.Name).Append("新增房源的數量是:")
.Append(count).AppendLine();
}
}
log.Debug("收集新增房源數量完成" + sbMsg);
//要使用System.Net.Mail下的類,不要用System.Web.Mail下的類
using (MailMessage mailMessage = new MailMessage())
{
using (SmtpClient smtpClient = new SmtpClient(smtpServer))
{
//由於可能有多個老闆都想收到這個郵件,因此在配置中可以用分號
//分隔開各個老闆的郵箱地址
foreach (var bossEmail in bossEmails.Split(';'))
{
mailMessage.To.Add(bossEmail);
}
mailMessage.Body = sbMsg.ToString();
mailMessage.From = new MailAddress(smtpEmail);
mailMessage.Subject = "今日新增房源數量報表";
smtpClient.Credentials
= new System.Net.NetworkCredential(smtpUserName, smtpPassword);//如果啓用了“客戶端授權碼”,要用授權碼代替密碼
smtpClient.Send(mailMessage);
}
}
log.Debug("給老闆發送新增房源數量報表完成");
}
catch (Exception ex)
{
log.Error("給老闆發報表出錯", ex);
}
}
}