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)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值