首页 > 其他分享 >我的NopCommerce之旅(2): 定时任务之邮件

我的NopCommerce之旅(2): 定时任务之邮件

时间:2023-03-11 22:33:17浏览次数:57  
标签:scheduleTask 缓存 之旅 cache task NopCommerce var null 邮件

一、功能简介

用户购买物品生成订单后,系统将发送邮件提醒给用户

二、操作步骤

  1. 后台配置一个系统的默认发送邮箱
  2. 启动定时任务,这里包括多个任务,只需要启动邮件任务
  3. 查看邮件发送情况

三、数据库分析

  1. [dbo].[Log] 系统日志表,可查看邮件发送失败的异常信息
  2. [dbo].[EmailAccount] 系统发送邮件配置表
  3. [dbo].[QueuedEmail] 订单邮件序列表,[SentTries]为重试次数,默认尝试3次失败后不再发送。
  4. [dbo].[ScheduleTask] 定时任务信息表,存储定时任务信息。

四、源码解析

  1. 根据MVC命名规则,可定位到Nop.Admin.Controllers命名空间,
  2. 查看ScheduleTaskController的RunNow方法,可跟踪查看到任务调用机制。
    1. 通过反射类型,采用autofac实例化对象,然后执行。
    2. 任务实现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         }
复制代码

 

五、技术解析

  1. Autofac的依赖注入
  2. 反射

我的NopCommerce之旅(5): 缓存

 

一、基础介绍

1.什么是cache      Web缓存是指一个Web资源(如html页面,图片,js,数据等)存在于Web服务器和客户端(浏览器)之间的副本。 2.为什么要用cache      即cache的作用,有以下几点:      2.1.减少网络带宽消耗;      2.2.降低服务器压力;      2.3.减少网络延迟、加快页面打开速度。 3.cache的分类      常见分类如下:      3.1.数据库数据缓存;      3.2.服务器端缓存;           a.代理服务器缓存           b.CDN缓存      3.3.浏览器缓存;      3.4.Web应用缓存

二、NopCommerce的缓存分析

1.UML      接口ICacheManager;      实现MemoryCacheManager(HTTP请求缓存,生命周期长),NopNullCache(仅实现接口,不提供缓存机制),PerRequestCacheManager(HTTP请求缓存,生命周期短),RedisCacheManager(Redis缓存);      扩展CacheExtensions; 2.代码分析      2.1.Nop.Web.Framework.DependencyRegistrar类,配置依赖注入的ICacheManager。       复制代码
1             //cache managers
2             if (config.RedisCachingEnabled)
3             {
4                 builder.RegisterType<RedisCacheManager>().As<ICacheManager>().Named<ICacheManager>("nop_cache_static").InstancePerLifetimeScope();
5             }
6             else
7             {
8                 builder.RegisterType<MemoryCacheManager>().As<ICacheManager>().Named<ICacheManager>("nop_cache_static").SingleInstance();
9             }
复制代码

     2.2.RedisCachingEnabled通过读取配置文件,见Nop.Core.Configuration.NopConfig

      复制代码
 1             var redisCachingNode = section.SelectSingleNode("RedisCaching");
 2             if (redisCachingNode != null && redisCachingNode.Attributes != null)
 3             {
 4                 var enabledAttribute = redisCachingNode.Attributes["Enabled"];
 5                 if (enabledAttribute != null)
 6                     config.RedisCachingEnabled = Convert.ToBoolean(enabledAttribute.Value);
 7 
 8                 var connectionStringAttribute = redisCachingNode.Attributes["ConnectionString"];
 9                 if (connectionStringAttribute != null)
10                     config.RedisCachingConnectionString = connectionStringAttribute.Value;
11             }
复制代码

3.应用

     通过依赖注入,生成缓存管理类实例,通过方法读取、设置缓存。       复制代码
        [NonAction]
        protected virtual List<int> GetChildCategoryIds(int parentCategoryId)
        {
            string cacheKey = string.Format(ModelCacheEventConsumer.CATEGORY_CHILD_IDENTIFIERS_MODEL_KEY, 
                parentCategoryId, 
                string.Join(",", _workContext.CurrentCustomer.GetCustomerRoleIds()), 
                _storeContext.CurrentStore.Id);
            return _cacheManager.Get(cacheKey, () =>
            {
                var categoriesIds = new List<int>();
                var categories = _categoryService.GetAllCategoriesByParentCategoryId(parentCategoryId);
                foreach (var category in categories)
                {
                    categoriesIds.Add(category.Id);
                    categoriesIds.AddRange(GetChildCategoryIds(category.Id));
                }
                return categoriesIds;
            });
        }
复制代码

标签:scheduleTask,缓存,之旅,cache,task,NopCommerce,var,null,邮件
From: https://www.cnblogs.com/Alex80/p/17207219.html

相关文章

  • HTML-邮件
    <!doctypehtml><html><head><title>收件箱</title><linkrel="stylesheet"href="https://cdn.staticfile.org/twitter-bootstrap/3.3.7/css/bootstrap.min.......
  • 929. 独特的电子邮件地址
    929.独特的电子邮件地址每个有效电子邮件地址都由一个本地名和一个域名组成,以'@'符号分隔。除小写字母之外,电子邮件地址还可以含有一个或多个 '.'或'+'。......
  • 该如何选择适合企业发展的邮件系统?
    很多人将邮件服务器单纯的理解为帮助企业收发邮件,其实邮箱类服务器不但可以收发邮件,还能够通过更多广受欢迎的功能实现更多企业管理的需求。如邮箱类服务器拥有邮件整理的......
  • 展会邮件营销方案
    2023开年以来,中国经济普遍回暖,各行各业释放出强劲活力,消费信心备受鼓舞。会展作为促进链接产业链、供应链、价值链的重要平台,会展业也会在今年全面复苏,一系列行业大展将陆续......
  • JavaMail 邮件发送,有意思的附件名乱码 → 客户端正常,web端乱码
    开心一刻昨晚,媳妇很感伤的看着我媳妇:以后岁数大了,我要走你前面去了,你再找个老伴我:我不想找媳妇:你找一个,不用替我守着,以后你说你头疼发烧,也得有个给你......
  • yagmail:简单易用的邮件发送库
    Python发送邮件可以使用标准库smtplib,但是那个库使用起来比较麻烦。下面介绍一个第三方库:yagmail,发送邮件简直不能更方便。首先进行安装,直接pipinstallyagmail即可......
  • 构造邮件回复地址
    最近垃圾和钓鱼邮件比较猖狂,在技术交流群里有人咨询,钓鱼邮件是从邮箱A发来的,发现该邮的回复地址确是另一个邮箱B,这个是怎么实现的。比如:其实很简单,构造邮件时添加一个'R......
  • 收到邮件了,微软新必应(New Bing)可以用了,只隔了一天
    收到邮件了,微软新必应(NewBing)可以用了,只隔了一天国内申请微软新必应(NewBing)1号我写了一篇文章,介绍内置ChatGPT的微软新必应(NewBing)申请方法,没想到昨天就收到了通过的......
  • 企业微信邮箱定时发送邮件,但无法撤回
      企业微信邮箱定时发送邮件,设置为第二天发送,等到了第二天,在自助查询的时候可以看到发信时间为昨天设置定时发送的时间,而且在这里点撤回键也无法撤回。需要在邮件里面......
  • 网站监控邮件发送方法
    网站监控、功能脚本执行结果邮件:/***邮件发送方法*@paramstring$title邮件主题*@paramstring$content邮件内容*/functionsend_email($title,$content){......