目标:
1:springboot 整合 mail
2: mail 使用freemark 实现模板动态生成(就是通过字符串生成模板,不需要在工程中写入固定模板)
3: springboot 整合aop 实现日志记录
4:使用工厂模式 处理调度不同的邮件类型
5:实现异步 发送,
6:失败 三次重试
这是一个 freemark动态生成模板的例子
1 public String content() {
try {
Configuration configuration = new Configuration(Configuration.getVersion()); // ’加载模板文件
// ‘模板内容,这里测试时使用简单的字符串作为模板
String templateString = "" + "<html>\n" + " <head></head>\n" + " <body>\n"
+ " <font color='red' size='30'>名称:${name}</font>\n" + " </body>\n" + "</html>"; // ’创建模板加载器
StringTemplateLoader templateLoader = new StringTemplateLoader(); // ‘ 存入模板
templateLoader.putTemplate("template", templateString); // template = 虚拟名称, 用来当作获取静态文件的key // ’加载模板加载器
configuration.setTemplateLoader(templateLoader); // ‘ 得到模板
Template template = configuration.getTemplate("template", "utf-8"); // ’创建模型数据
Map<String, Object> map = new HashMap<String, Object>(); map.put("name", "张三"); // ‘执行静态化 方式1 获取静态化内容
String content = FreeMarkerTemplateUtils.processTemplateIntoString(template, map);
System.out.println(content);// 静态化内容
return content;
} catch (Exception e) {
return null;
} }
这个是邮件的目录以及设计思路(各个类的作用)

 

 然后就贴点有意思的代码

 异步
import java.util.concurrent.Executor;
import java.util.concurrent.ThreadPoolExecutor; import org.springframework.aop.interceptor.AsyncUncaughtExceptionHandler;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.AsyncConfigurer;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; @Configuration
public class ThreadPoolTaskConfig implements AsyncConfigurer { @Bean("taskExecutor")
@Override
public Executor getAsyncExecutor() {
ThreadPoolTaskExecutor threadPoolTaskExecutor = new ThreadPoolTaskExecutor();
threadPoolTaskExecutor.setQueueCapacity(200); // ‘队列容量
threadPoolTaskExecutor.setCorePoolSize(5); // ’核心线程数量
threadPoolTaskExecutor.setMaxPoolSize(100); // ‘最大线程数量
threadPoolTaskExecutor.setKeepAliveSeconds(300); // ’允许线程空闲时间
// ’用于被拒绝任务的处理程序,它直接在 execute 方法的调用线程中运行被拒绝的任务;如果执行程序已关闭,则会丢弃该任务
threadPoolTaskExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
threadPoolTaskExecutor.initialize(); // ‘重新初始化
return threadPoolTaskExecutor;
} @Override
public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
// TODO Auto-generated method stub
return null;
} } 异步的使用
@Async("taskExecutor")
public void sendMail(Integer templateId, String subject, String mailType, String to, String cc,
Map<String, String> mailTemplateParam, String attachmentFilename, DataSource dataSource) { }
 aop

 这是依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency> 这是注解开启
@EnableAspectJAutoProxy 这是配置
spring.aop.auto=true 这是注解声明
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target; @Target({ ElementType.METHOD, ElementType.TYPE })
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface MailSendLog { } 这是注解的实现也就切面 import java.lang.reflect.Method;
import java.security.Principal;
import java.util.Date;
import java.util.HashMap;
import java.util.Map; import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest; import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.core.DefaultParameterNameDiscoverer;
import org.springframework.core.ParameterNameDiscoverer;
import org.springframework.stereotype.Component; import com.sony.sie.hrevaluate.model.MailSendLogModel;
import com.sony.sie.hrevaluate.service.MailSendLogService; @Aspect
@Component
public class MailSendLogAspect { //这是切点 是声明的绝对路径
@Pointcut("@annotation(com.sony.sie.hrevaluate.mail.annotation.MailSendLog)")
public void annotationPointCut() { } //这是注解增强
@Around("annotationPointCut()")
public void Around(ProceedingJoinPoint joinPoint) throws Throwable {
saveMailSendLog(joinPoint);
} //这里写一个和切点相关的工具类,可以获取方法中的参数,反射的原理
private void saveMailSendLog(ProceedingJoinPoint joinPoint) throws Throwable {
/*
* mail sender
*/
String sender = ""; /**
* mail send result
*/
String res = (String) joinPoint.proceed(); /*
* mail parameter
*/
Object[] args = joinPoint.getArgs();
ParameterNameDiscoverer pnd = new DefaultParameterNameDiscoverer();
MethodSignature signature = (MethodSignature) joinPoint.getSignature();
Method method = signature.getMethod();
String[] parameterNames = pnd.getParameterNames(method);
Map<String, Object> paramMap = new HashMap<>(32);
for (int i = 0; i < parameterNames.length; i++) {
paramMap.put(parameterNames[i], args[i]);
}
}
备注
1:本来想使用策略模式的,但是策略模式需要借助接口才能实现,所以就用了抽象类,实现工厂模式
2:失败重试三次就是用do while 控制
3:从方法到异步方法也是需要时间的,尽量提前点
4:整合freemark实现动态生成模板的核心已经写了,至于整合freemark网上很多就啰嗦啦
5:下一步整合定时任务再配合邮件做一个完整的模块

====================================================凑字数,博客园代码块里的文字不算字数,这个有点坑===================================================================

====================================================凑字数,博客园代码块里的文字不算字数,这个有点坑===================================================================

====================================================凑字数,博客园代码块里的文字不算字数,这个有点坑===================================================================

====================================================凑字数,博客园代码块里的文字不算字数,这个有点坑===================================================================

====================================================凑字数,博客园代码块里的文字不算字数,这个有点坑===================================================================

====================================================凑字数,博客园代码块里的文字不算字数,这个有点坑===================================================================

====================================================凑字数,博客园代码块里的文字不算字数,这个有点坑===================================================================

====================================================凑字数,博客园代码块里的文字不算字数,这个有点坑===================================================================

====================================================凑字数,博客园代码块里的文字不算字数,这个有点坑===================================================================

====================================================凑字数,博客园代码块里的文字不算字数,这个有点坑===================================================================

====================================================凑字数,博客园代码块里的文字不算字数,这个有点坑===================================================================

====================================================凑字数,博客园代码块里的文字不算字数,这个有点坑===================================================================

====================================================凑字数,博客园代码块里的文字不算字数,这个有点坑===================================================================

====================================================凑字数,博客园代码块里的文字不算字数,这个有点坑===================================================================

====================================================凑字数,博客园代码块里的文字不算字数,这个有点坑===================================================================

====================================================凑字数,博客园代码块里的文字不算字数,这个有点坑===================================================================

====================================================凑字数,博客园代码块里的文字不算字数,这个有点坑===================================================================

====================================================凑字数,博客园代码块里的文字不算字数,这个有点坑===================================================================

====================================================凑字数,博客园代码块里的文字不算字数,这个有点坑===================================================================

====================================================凑字数,博客园代码块里的文字不算字数,这个有点坑===================================================================

====================================================凑字数,博客园代码块里的文字不算字数,这个有点坑===================================================================

====================================================凑字数,博客园代码块里的文字不算字数,这个有点坑===================================================================

====================================================凑字数,博客园代码块里的文字不算字数,这个有点坑===================================================================

====================================================凑字数,博客园代码块里的文字不算字数,这个有点坑===================================================================

====================================================凑字数,博客园代码块里的文字不算字数,这个有点坑===================================================================

====================================================凑字数,博客园代码块里的文字不算字数,这个有点坑===================================================================

====================================================凑字数,博客园代码块里的文字不算字数,这个有点坑===================================================================

====================================================凑字数,博客园代码块里的文字不算字数,这个有点坑===================================================================

====================================================凑字数,博客园代码块里的文字不算字数,这个有点坑===================================================================

====================================================凑字数,博客园代码块里的文字不算字数,这个有点坑===================================================================

====================================================凑字数,博客园代码块里的文字不算字数,这个有点坑===================================================================

====================================================凑字数,博客园代码块里的文字不算字数,这个有点坑===================================================================

====================================================凑字数,博客园代码块里的文字不算字数,这个有点坑===================================================================

====================================================凑字数,博客园代码块里的文字不算字数,这个有点坑===================================================================

====================================================凑字数,博客园代码块里的文字不算字数,这个有点坑===================================================================

====================================================凑字数,博客园代码块里的文字不算字数,这个有点坑===================================================================

====================================================凑字数,博客园代码块里的文字不算字数,这个有点坑===================================================================

====================================================凑字数,博客园代码块里的文字不算字数,这个有点坑===================================================================

====================================================凑字数,博客园代码块里的文字不算字数,这个有点坑===================================================================

====================================================凑字数,博客园代码块里的文字不算字数,这个有点坑===================================================================

====================================================凑字数,博客园代码块里的文字不算字数,这个有点坑===================================================================

====================================================凑字数,博客园代码块里的文字不算字数,这个有点坑===================================================================

====================================================凑字数,博客园代码块里的文字不算字数,这个有点坑===================================================================

====================================================凑字数,博客园代码块里的文字不算字数,这个有点坑===================================================================

====================================================凑字数,博客园代码块里的文字不算字数,这个有点坑===================================================================

====================================================凑字数,博客园代码块里的文字不算字数,这个有点坑===================================================================

====================================================凑字数,博客园代码块里的文字不算字数,这个有点坑===================================================================

====================================================凑字数,博客园代码块里的文字不算字数,这个有点坑===================================================================

====================================================凑字数,博客园代码块里的文字不算字数,这个有点坑===================================================================

====================================================凑字数,博客园代码块里的文字不算字数,这个有点坑===================================================================

====================================================凑字数,博客园代码块里的文字不算字数,这个有点坑===================================================================

====================================================凑字数,博客园代码块里的文字不算字数,这个有点坑===================================================================

====================================================凑字数,博客园代码块里的文字不算字数,这个有点坑===================================================================

====================================================凑字数,博客园代码块里的文字不算字数,这个有点坑===================================================================

====================================================凑字数,博客园代码块里的文字不算字数,这个有点坑===================================================================

====================================================凑字数,博客园代码块里的文字不算字数,这个有点坑===================================================================

最新文章

  1. 【腾讯Bugly干货分享】移动客户端中高效使用SQLite
  2. MyBatis持久层框架使用总结
  3. android 存储图片到data目录和读取data目录下的图片
  4. 使用Python对文档单词进行计数
  5. luogu1328[NOIP2014 T1]生活大爆炸版石头剪刀布
  6. android APK应用安装过程以及默认安装路径[转]
  7. 自定义progressBar的旋转圆圈
  8. PHP学习(二)----数组
  9. EF 更新条目时出错。有关详细信息,请参见内部异常。
  10. textview设置字体的行距和字间距
  11. Win7下IE8无法打开https类型的网站解决方法笔记
  12. 在C#中internal关键字是什么意思?
  13. ubuntu下ffmpeg的安装,实现支持3gpp等转换
  14. [转载]字符编码笔记:ASCII,Unicode和UTF-8
  15. 常见B2C网站购物车的设计
  16. Canvas文本绘制
  17. UML2和建模工具学习总结
  18. ZOJ - 3818 字符串
  19. Mysql SQL Mode详解
  20. [转]Docker中的镜像

热门文章

  1. 阻止保存要求重新创建表的更改-只需设置SQLServer的一个设置
  2. [Go] 利用函数类型实现封装中的回调
  3. Node接口实现HTTPS版的
  4. fiddler添加IP列
  5. DBCC TRACEON - 跟踪标志 (Transact-SQL)
  6. Spring Boot 配置文件中的花样,看这一篇足矣!
  7. 一起学Android之ContentProvider
  8. 关于C# webapi ,接口返回字符串和json格式 ,返回值中有反斜杠
  9. C#面向对象--简介
  10. ASP.NET Core 2.2 WebApi 系列【一】搭建ASP.NET Core WebApi项目