springboot mail整合freemark实现动态生成模板

目标:
1:springboot 整合 mail
2: mail 使用freemark 实现模板动态生成(就是通过字符串生成模板,不需要在工程中写入固定模板)
3: springboot 整合aop 实现日志记录
4:使用工厂模式 处理调度不同的邮件类型
5:实现异步 发送,
6:失败 三次重试

 

这是一个 freemark动态生成模板的例子
1
public String content() { 2 try { 3 Configuration configuration = new Configuration(Configuration.getVersion()); 4 5 // ’加载模板文件 6 // ‘模板内容,这里测试时使用简单的字符串作为模板 7 String templateString = "" + "<html>\n" + " <head></head>\n" + " <body>\n" 8 + " <font color='red' size='30'>名称:${name}</font>\n" + " </body>\n" + "</html>"; 9 10 // ’创建模板加载器 11 StringTemplateLoader templateLoader = new StringTemplateLoader(); 12 13 // ‘ 存入模板 14 templateLoader.putTemplate("template", templateString); // template = 虚拟名称, 用来当作获取静态文件的key 15 16 // ’加载模板加载器 17 configuration.setTemplateLoader(templateLoader); 18 19 // ‘ 得到模板 20 Template template = configuration.getTemplate("template", "utf-8"); 21 22 // ’创建模型数据 23 Map<String, Object> map = new HashMap<String, Object>(); 24 25 map.put("name", "张三"); 26 27 // ‘执行静态化 方式1 获取静态化内容 28 String content = FreeMarkerTemplateUtils.processTemplateIntoString(template, map); 29 System.out.println(content);// 静态化内容 30 return content; 31 } catch (Exception e) { 32 return null; 33 } 34 35 }

 

这个是邮件的目录以及设计思路(各个类的作用)

 

 

 

 

 1 然后就贴点有意思的代码
 2 
 3 异步
 4 import java.util.concurrent.Executor;
 5 import java.util.concurrent.ThreadPoolExecutor;
 6 
 7 import org.springframework.aop.interceptor.AsyncUncaughtExceptionHandler;
 8 import org.springframework.context.annotation.Bean;
 9 import org.springframework.context.annotation.Configuration;
10 import org.springframework.scheduling.annotation.AsyncConfigurer;
11 import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
12 
13 @Configuration
14 public class ThreadPoolTaskConfig implements AsyncConfigurer {
15 
16     @Bean("taskExecutor")
17     @Override
18     public Executor getAsyncExecutor() {
19         ThreadPoolTaskExecutor threadPoolTaskExecutor = new ThreadPoolTaskExecutor();
20         threadPoolTaskExecutor.setQueueCapacity(200); // ‘队列容量
21         threadPoolTaskExecutor.setCorePoolSize(5); // ’核心线程数量
22         threadPoolTaskExecutor.setMaxPoolSize(100); // ‘最大线程数量
23         threadPoolTaskExecutor.setKeepAliveSeconds(300); // ’允许线程空闲时间
24         // ’用于被拒绝任务的处理程序,它直接在 execute 方法的调用线程中运行被拒绝的任务;如果执行程序已关闭,则会丢弃该任务
25         threadPoolTaskExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
26         threadPoolTaskExecutor.initialize(); // ‘重新初始化
27         return threadPoolTaskExecutor;
28     }
29 
30     @Override
31     public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
32         // TODO Auto-generated method stub
33         return null;
34     }
35 
36 }
37 
38 异步的使用
39     @Async("taskExecutor")
40     public void sendMail(Integer templateId, String subject, String mailType, String to, String cc,
41             Map<String, String> mailTemplateParam, String attachmentFilename, DataSource dataSource) {
42     
43     }
 1 aop
 2 
 3 这是依赖
 4 <dependency>
 5             <groupId>org.springframework.boot</groupId>
 6             <artifactId>spring-boot-starter-aop</artifactId>
 7         </dependency>
 8 
 9 这是注解开启
10 @EnableAspectJAutoProxy
11 
12 这是配置
13 spring.aop.auto=true
14 
15 这是注解声明
16 import java.lang.annotation.Documented;
17 import java.lang.annotation.ElementType;
18 import java.lang.annotation.Retention;
19 import java.lang.annotation.RetentionPolicy;
20 import java.lang.annotation.Target;
21 
22 @Target({ ElementType.METHOD, ElementType.TYPE })
23 @Retention(RetentionPolicy.RUNTIME)
24 @Documented
25 public @interface MailSendLog {
26 
27 }
28 
29 这是注解的实现也就切面
30 
31 import java.lang.reflect.Method;
32 import java.security.Principal;
33 import java.util.Date;
34 import java.util.HashMap;
35 import java.util.Map;
36 
37 import javax.annotation.Resource;
38 import javax.servlet.http.HttpServletRequest;
39 
40 import org.aspectj.lang.JoinPoint;
41 import org.aspectj.lang.ProceedingJoinPoint;
42 import org.aspectj.lang.annotation.Around;
43 import org.aspectj.lang.annotation.Aspect;
44 import org.aspectj.lang.annotation.Before;
45 import org.aspectj.lang.annotation.Pointcut;
46 import org.aspectj.lang.reflect.MethodSignature;
47 import org.springframework.core.DefaultParameterNameDiscoverer;
48 import org.springframework.core.ParameterNameDiscoverer;
49 import org.springframework.stereotype.Component;
50 
51 import com.sony.sie.hrevaluate.model.MailSendLogModel;
52 import com.sony.sie.hrevaluate.service.MailSendLogService;
53 
54 @Aspect
55 @Component
56 public class MailSendLogAspect {
57 
58 //这是切点 是声明的绝对路径
59 @Pointcut("@annotation(com.sony.sie.hrevaluate.mail.annotation.MailSendLog)")
60     public void annotationPointCut() {
61 
62     }
63 
64 //这是注解增强
65 @Around("annotationPointCut()")
66     public void Around(ProceedingJoinPoint joinPoint) throws Throwable {
67         saveMailSendLog(joinPoint);
68     }
69 
70 //这里写一个和切点相关的工具类,可以获取方法中的参数,反射的原理
71     private void saveMailSendLog(ProceedingJoinPoint joinPoint) throws Throwable {
72         /*
73          * mail sender
74          */
75         String sender = "";
76 
77         /**
78          * mail send result
79          */
80         String res = (String) joinPoint.proceed();
81 
82         /*
83          * mail parameter
84          */
85         Object[] args = joinPoint.getArgs();
86         ParameterNameDiscoverer pnd = new DefaultParameterNameDiscoverer();
87         MethodSignature signature = (MethodSignature) joinPoint.getSignature();
88         Method method = signature.getMethod();
89         String[] parameterNames = pnd.getParameterNames(method);
90         Map<String, Object> paramMap = new HashMap<>(32);
91         for (int i = 0; i < parameterNames.length; i++) {
92             paramMap.put(parameterNames[i], args[i]);
93         }
94     }
备注
1:本来想使用策略模式的,但是策略模式需要借助接口才能实现,所以就用了抽象类,实现工厂模式
2:失败重试三次就是用do while 控制
3:从方法到异步方法也是需要时间的,尽量提前点
4:整合freemark实现动态生成模板的核心已经写了,至于整合freemark网上很多就啰嗦啦
5:下一步整合定时任务再配合邮件做一个完整的模块

 

 

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

posted @ 2019-10-24 17:45  小傻孩丶儿  阅读(968)  评论(0编辑  收藏  举报