我的NopCommerce之旅(4): 定时任务之邮件
一、功能简介
用户购买物品生成订单后,系统将发送邮件提醒给用户
二、操作步骤
- 后台配置一个系统的默认发送邮箱
- 启动定时任务,这里包括多个任务,只需要启动邮件任务
- 查看邮件发送情况
三、数据库分析
- [dbo].[Log] 系统日志表,可查看邮件发送失败的异常信息
- [dbo].[EmailAccount] 系统发送邮件配置表
- [dbo].[QueuedEmail] 订单邮件序列表,[SentTries]为重试次数,默认尝试3次失败后不再发送。
- [dbo].[ScheduleTask] 定时任务信息表,存储定时任务信息。
四、源码解析
- 根据MVC命名规则,可定位到Nop.Admin.Controllers命名空间,
- 查看ScheduleTaskController的RunNow方法,可跟踪查看到任务调用机制。
- 通过反射类型,采用autofac实例化对象,然后执行。
- 任务实现Nop.Services.Tasks.ITask接口的Execute()方法,如Nop.Services.Messages.QueuedMessagesSendTask。
1 private ITask CreateTask(ILifetimeScope scope) 2 { 3 ITask task = null; 4 if (this.Enabled) 5 { 6 var type2 = System.Type.GetType(this.Type); 7 if (type2 != null) 8 { 9 object instance; 10 if (!EngineContext.Current.ContainerManager.TryResolve(type2, scope, out instance)) 11 { 12 //not resolved 13 instance = EngineContext.Current.ContainerManager.ResolveUnregistered(type2, scope); 14 } 15 task = instance as ITask; 16 } 17 } 18 return task; 19 }
1 /// <summary> 2 /// Executes the task 3 /// </summary> 4 /// <param name="throwException">A value indicating whether exception should be thrown if some error happens</param> 5 /// <param name="dispose">A value indicating whether all instances should be disposed after task run</param> 6 /// <param name="ensureRunOnOneWebFarmInstance">A value indicating whether we should ensure this task is run on one farm node at a time</param> 7 public void Execute(bool throwException = false, bool dispose = true, bool ensureRunOnOneWebFarmInstance = true) 8 { 9 ... 10 //initialize and execute 初始化成功后执行任务 11 var task = this.CreateTask(scope); 12 if (task != null) 13 { 14 this.LastStartUtc = DateTime.UtcNow; 15 if (scheduleTask != null) 16 { 17 //update appropriate datetime properties 18 scheduleTask.LastStartUtc = this.LastStartUtc; 19 scheduleTaskService.UpdateTask(scheduleTask); 20 } 21 task.Execute(); 22 this.LastEndUtc = this.LastSuccessUtc = DateTime.UtcNow; 23 } 24 } 25 catch (Exception exc) 26 { 27 this.Enabled = !this.StopOnError; 28 this.LastEndUtc = DateTime.UtcNow; 29 30 //log error 31 var logger = EngineContext.Current.ContainerManager.Resolve<ILogger>("", scope); 32 logger.Error(string.Format("Error while running the '{0}' schedule task. {1}", this.Name, exc.Message), exc); 33 if (throwException) 34 throw; 35 } 36 37 if (scheduleTask != null) 38 { 39 //update appropriate datetime properties 40 scheduleTask.LastEndUtc = this.LastEndUtc; 41 scheduleTask.LastSuccessUtc = this.LastSuccessUtc; 42 scheduleTaskService.UpdateTask(scheduleTask); 43 } 44 45 //dispose all resources 46 if (dispose) 47 { 48 scope.Dispose(); 49 } 50 }
五、技术解析
- Autofac的依赖注入
- 反射
转载于:https://www.cnblogs.com/devilsky/p/5337285.html
我的NopCommerce之旅(4): 定时任务之邮件相关推荐
- Jenkins+Jmeter持续集成笔记(四:定时任务和邮件通知)
通过前几篇文章,jmeter+ant+jenkins自动化持续构建的测试平台基本成型.既然要自动化平台,最基本的肯定要实现不经过人工干预,平台会在特定的条件下自动运行测试脚本,并在脚本运行结束后,发送 ...
- SpringBoot整合定时任务和邮件发送(邮箱 信息轰炸 整蛊)
SpringBoot整合定时任务和邮件发送(邮箱 信息轰炸 整蛊) 目录 SpringBoot整合定时任务和邮件发送(邮箱 信息轰炸 整蛊) 1.概述 2.最佳实践 2.1创建项目引入依赖(mail) ...
- Django实现定时任务和邮件发送(含各种附件)功能
文本初衷是为了实现在 Django 项目中设置定时任务,通过定时任务备份数据并发送到指定的邮箱中. 先来看一下最终的效果 文章目录 settings.py 邮箱配置 定时任务配置 定时任务邮件功能 发 ...
- springboot的应用(springboot+定时任务+发邮件)
1.定时任务 定时任务可以设置精确到秒的准确时间去自动执行方法. 我要一个程序每一秒钟说一句:java小新人最帅 于是,我就写了一个方法,注解里cron里面的很多星星意思是:每个月.周一到周日 .每个 ...
- 带着新人学springboot的应用10(springboot+定时任务+发邮件)
接上一节,环境一样,这次来说另外两个任务,一个是定时任务,一个是发邮件. 1.定时任务 定时任务可以设置精确到秒的准确时间去自动执行方法. 我要一个程序每一秒钟说一句:java小新人最帅 于是,我就写 ...
- linux创建定时任务发邮件
1.首先安装mutt 和sendmail [root@smp ~]$yum -y install sendmail mutt mailx 2.配置发邮件的邮箱 [root@smp ~]$vim /et ...
- Linux基础(九)--定时任务
本文主要介绍了Linux中定时任务的相关知识. 在日常中,有一些任务需要定时执行,例如:每天定时更新杀毒软件的数据库,每天定时执行数据清洗等脚本.这里就需要做定时任务. (1)概述 在Linux中定时 ...
- crontab定时任务不执行,并且没有收到错误信息邮件
现象: crontab中定义的msqldump定时任务不能执行,没有收到错误信息邮件,查看日志/var/log/cron显示如下 CROND[15777]: (root) MAIL (mailed 3 ...
- 三种任务(异步任务、邮件任务、定时任务)
异步任务 引入 在实际应用中,常常会使用到异步任务.比如发送邮件的时候,后台需要一段时间去发送,而前台这边需要等后台响应结束后才能进行下一步,这种问题一般使用多线程就能解决. 开启异步任务的 ...
最新文章
- C 把两个bitmap文件合并成一个bitmap文件
- 这就是爱?英特尔处理器将整合AMD HBM2 GPU
- 向量召回 MIND多兴趣双塔模型
- HttpServletRequest中getAttribute()和getParameter()的区别
- getParameterValues用法
- Linux 光盘 远程拷贝,Linux远程拷贝scp命令
- Unity3D 4.x怎样实现动画的Ping Pong效果
- 微信开发者工具不显示二维码问题
- 机器学习算法思想简单梳理
- Redis与Mysql双写一致性方案解析
- 文献阅读笔记【10】:基于小尺度分形维数的裂缝图像分割方法
- 组合优化问题的典型事例
- JFianl项目中Controller层方法不进行权限校验-可以添加注解@UnCheck
- 火车头采集器采集教程
- 让你的编程不再乏味:「陪伴姬」来了!
- C/C++动态开辟数组【C++:new/delete(推荐):int *arr = new int[m];】【C++:vector】【C:malloc() free()】
- 医学院校教师备课系统的信息安全性研究
- 【LaTex】三线表加粗
- HDU 幸福列车 优先队列
- 学计算机买笔记本是i5 i7,对我们普通人买电脑来说,i7和i5、i3有多大区别,玩游戏选哪款好?!...
热门文章
- 单条MySQL最长_MySQL 单条记录长度最大65535
- react native text换行_基于React+Koa实现React SSR服务端渲染
- Java笔记-解决Cause: java.sql.SQLException: 试图在只读事务中修改数据(达梦数据库)
- Arduino笔记-定时器中断(MsTimer2库使用)
- Qt工作笔记-在ListWidget中多线程检索数据
- 反恐精英起源服务器文件在哪,反恐精英:起源人物模型放哪里
- 802.11 n wlan linux驱动下载,802.11n无线网卡驱动
- python做统计_利用 Python 进行统计
- html遮罩层模态提示,页面遮罩层,并且阻止页面body滚动。bootstrap模态框原理,.bootstrap模态...
- 微信小程序上传大于4m_微信定制小程序开发