email多线程异步发送设计文档
1 概述
系统中经常需要发送邮件通知用户,比较常见的是同步发送邮件,即在执行用户业务逻辑的线程中执行发送邮件动作;这样会造成发送邮件动作堵塞正常的业务逻辑执行,影响系统的整体性能,通过异步发送邮件,可以有效的提升用户使用满意度;通过将发送线程进行池化,可以避免线程创建并且有效的进行复用,节省资源。
2 需求及约束
2.1 需求
- 发送的邮件内容可以编辑并且不修改程序
- 每个发送模块可以配置不同邮件服务器、发送邮箱
- 发送邮件动作是异步
2.2 约束
- 发送邮件不需要百分之百成功
- 如果邮件内容来自于模板文件,设置的Freemaker的编码需要与模板文件的编码保持一致
3 详细设计
3.1 类图
1、Runnable:该接口是java.lang.Runnable。
2、EmailSender:该类实现Runnable,实现线程执行方法run,实现发送邮件动作sendEmail。其中run方法循环监控BlockedQueue队列,当队列有发送邮件请求时,就从队列中获取到EmailBody,然后调用sendEmail方法发送邮件。
3、ExecutorService:该接口为java.util.concurrent.ExecutorService。
4、SendEmailThreadPool:该类负责创建发送邮件的线程池(ExecutorService)。Init的方法逻辑:
4-1、根据配置信息中连接池的大小,使用Executors:newFixedThreadPool初始化连接池。
4-2、初始化BlockedQueue,假如配置信息的队列长度为0,那么就创建最大整数长度的对了(new LinkedTransferQueue),否则以长度为参数创建对了(new BoundedLinkedTransferQueue)。
4-3、启动发送邮件线程
5、SendEmailPools,持有线程池,构成key-value的对象,map的key值为发送邮件类型,value为对应的邮件线程池。
5、SendEmailConfigReader借助Digester进行线程池配置文件的解析
6、SendEmailThreadPoolFactory:初始化所有邮件线程池,对外暴露发送入口
6-1、 读取配置文件,获取发送邮件恶需 要的信息,同时也读取队列的长度和连接池的大小配置信息,最后封装为一个SendEmailPools,
6-2、 SendEmailThreadPool同时引用EmailConfig对象,即该连接池对应的邮件模板信息
6-3、 使用变量EmailConfig对象,创建发送邮件的主体信息,并通过EmailSender发送。
当web容器销毁时,调用SendEmailThreadPoolFactory的destroy方法。
3.2 时序图
1、容器启动
2、邮件发送
4.2 接口调用
SendEmailThreadPoolFactory对外暴露了三个静态方法
sendTemplateEmail 表示发送邮件的内容来自于模板文件,调用的参数包含邮件类型、接收地址以及对应模板文件中的参数
public static boolean sendTemplateEmail(String emailModel, String toEmail,Map<String, Object> params)
sendFixTemplateEmail表示要发送邮件的正文信息是固定的,通过配置了content元素设定的
public static boolean sendFixTemplateEmail(String emailModel, String toEmail)
sendContentEmail 表示发送自定义内容的邮件
public static boolean sendContentEmail(String emailModel, String toEmail, String content)
- 大小: 60.4 KB
- 大小: 43.9 KB
- 大小: 19.3 KB
分享到:
相关推荐
使用python多线程异步提高模型部署到rk3588NPU使用率_python源码+项目使用说明.zip 【项目资源说明】 使用多线程异步操作rknn模型, 提高rk3588/rk3588s的NPU使用率, 进而提高推理帧数(rk3568之类修改后应该也能使用,...
Java多线程实现异步调用实例。运行Main可以看到结果。main是主线程,另有A,B,C三个线程用不同的时间跑完。
java线程异步案例,以三个线程作为案例典型,同时发起三个线程,根据不同的订单领取各自的物品,自作过程同步处理。
根据MSDN上写的多线程异步传输,因为网络编程的程序比较少,有的很多都是错的,所以传一个上来,希望有更多的人对.NET网络变成进行交流
本程序提供了一个多任务多线程异步处理框架。该框架使用简单,用户只需要继承抽象类Task,构建自己的任务类,再构造一个任务源,就可以轻松使用这个框架。 程序包里提供了一个例子Mytask 和MyTaskGenerator, 用户只...
使用委托事件模拟多线程下载网络图片,即同时发送多个网络请求下载图片。 也可应用于其他异步多线程执行事件。
c# 多线程 异步进度条,通过多线程方法实现 多任务 进度控制的同步 显示
简洁实用的C#多线程异步控制,一个较简单多线程异步的例子,适合初学者理清多线程异步的操作控制!
多线程 异步 加载进度条 C# vs 2005 .net 1.0 C# 实现
使用多线程异步操作rknn模型, 提高rk3588/rk3588s的NPU使用率, 进而提高推理帧数,不过实际在使用摄像头做实时目标检测的时候帧率在25左右,所以后面打算主要使用rknpu2做板端部署,预计会快很多,有待验证 ...
C#多线程异步源码,以及的实现的算法。方便与以后的多线程开发。
描述:由C#编写的多线程异步抓取网页的网络爬虫控制台程序 功能:目前只能提取网络链接,所用的两个记录文件并不需要很大。网页文本、图片、视频和html代码暂时不能抓取,请见谅。 但需要注意,网页的数目是非常...
多线程异步调用(并参递参数)经典代码示例
CVI学习文件-多线程 异步定时器(修改增加学习版)
比上一次的版本做了优化和更能上的...增加了把指定事件任务分配给指定线程的功能 增加了吧指定事件任务分配给指定某一类线程的功能 对等待时间进行了优化以提高效率,增加CPU使用率 SampleTest.java为一个样例作为参考
用线程池和LruCache实现多线程异步下载图片
大规模虚拟地形数据多线程异步调度算法.pdf
Winform实现多线程异步更新UI(进度及状态信息) 实例代码
Java-多线程异步请求统一响应结果 多线程异步请求是指在多个线程同时发起请求,并且在请求过程中不阻塞主线程的执行。这样可以提高程序的并发能力和响应速度。 需要注意的是,在实际的异步请求中,可能需要使用...