email多线程异步发送设计文档

本文详细阐述了邮件异步发送的设计方案,包括系统需求、约束、详细设计、接口调用以及关键步骤流程。通过引入邮件发送线程池,实现了高效、灵活且可配置的邮件发送机制,显著提升了用户体验。
[align=center][size=medium][b]email多线程异步发送设计文档[/b][/size][/align]

[b]1 概述[/b]
系统中经常需要发送邮件通知用户,比较常见的是同步发送邮件,即在执行用户业务逻辑的线程中执行发送邮件动作;这样会造成发送邮件动作堵塞正常的业务逻辑执行,影响系统的整体性能,通过异步发送邮件,可以有效的提升用户使用满意度;通过将发送线程进行池化,可以避免线程创建并且有效的进行复用,节省资源。
[b]2 需求及约束[/b]
2.1 需求
[list]
[*] 发送的邮件内容可以编辑并且不修改程序
[*] 每个发送模块可以配置不同邮件服务器、发送邮箱
[*] 发送邮件动作是异步
[/list]
2.2 约束
[list]
[*] 发送邮件不需要百分之百成功
[*] 如果邮件内容来自于模板文件,设置的Freemaker的编码需要与模板文件的编码保持一致
[/list]
[b]3 详细设计[/b]
3.1 类图

[img]http://dl.iteye.com/upload/attachment/600050/8471b362-12f7-32da-b8d6-03eb20c5e78a.jpg[/img]

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、容器启动


[img]http://dl.iteye.com/upload/attachment/600053/bfa56539-3bb1-3c65-82d4-8ef71b29e373.jpg[/img]


2、邮件发送


[img]http://dl.iteye.com/upload/attachment/600059/3aa879b7-0219-368d-8ed0-bdd0d6413bef.png[/img]


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)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值