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:下一步整合定时任务再配合邮件做一个完整的模块
====================================================凑字数,博客园代码块里的文字不算字数,这个有点坑===================================================================
====================================================凑字数,博客园代码块里的文字不算字数,这个有点坑===================================================================
====================================================凑字数,博客园代码块里的文字不算字数,这个有点坑===================================================================
====================================================凑字数,博客园代码块里的文字不算字数,这个有点坑===================================================================
====================================================凑字数,博客园代码块里的文字不算字数,这个有点坑===================================================================
====================================================凑字数,博客园代码块里的文字不算字数,这个有点坑===================================================================
====================================================凑字数,博客园代码块里的文字不算字数,这个有点坑===================================================================
====================================================凑字数,博客园代码块里的文字不算字数,这个有点坑===================================================================
====================================================凑字数,博客园代码块里的文字不算字数,这个有点坑===================================================================
====================================================凑字数,博客园代码块里的文字不算字数,这个有点坑===================================================================
====================================================凑字数,博客园代码块里的文字不算字数,这个有点坑===================================================================
====================================================凑字数,博客园代码块里的文字不算字数,这个有点坑===================================================================
====================================================凑字数,博客园代码块里的文字不算字数,这个有点坑===================================================================
====================================================凑字数,博客园代码块里的文字不算字数,这个有点坑===================================================================
====================================================凑字数,博客园代码块里的文字不算字数,这个有点坑===================================================================
====================================================凑字数,博客园代码块里的文字不算字数,这个有点坑===================================================================
====================================================凑字数,博客园代码块里的文字不算字数,这个有点坑===================================================================
====================================================凑字数,博客园代码块里的文字不算字数,这个有点坑===================================================================
====================================================凑字数,博客园代码块里的文字不算字数,这个有点坑===================================================================
====================================================凑字数,博客园代码块里的文字不算字数,这个有点坑===================================================================
====================================================凑字数,博客园代码块里的文字不算字数,这个有点坑===================================================================
====================================================凑字数,博客园代码块里的文字不算字数,这个有点坑===================================================================
====================================================凑字数,博客园代码块里的文字不算字数,这个有点坑===================================================================
====================================================凑字数,博客园代码块里的文字不算字数,这个有点坑===================================================================
====================================================凑字数,博客园代码块里的文字不算字数,这个有点坑===================================================================
====================================================凑字数,博客园代码块里的文字不算字数,这个有点坑===================================================================
====================================================凑字数,博客园代码块里的文字不算字数,这个有点坑===================================================================
====================================================凑字数,博客园代码块里的文字不算字数,这个有点坑===================================================================
====================================================凑字数,博客园代码块里的文字不算字数,这个有点坑===================================================================
====================================================凑字数,博客园代码块里的文字不算字数,这个有点坑===================================================================
====================================================凑字数,博客园代码块里的文字不算字数,这个有点坑===================================================================
====================================================凑字数,博客园代码块里的文字不算字数,这个有点坑===================================================================
====================================================凑字数,博客园代码块里的文字不算字数,这个有点坑===================================================================
====================================================凑字数,博客园代码块里的文字不算字数,这个有点坑===================================================================
====================================================凑字数,博客园代码块里的文字不算字数,这个有点坑===================================================================
====================================================凑字数,博客园代码块里的文字不算字数,这个有点坑===================================================================
====================================================凑字数,博客园代码块里的文字不算字数,这个有点坑===================================================================
====================================================凑字数,博客园代码块里的文字不算字数,这个有点坑===================================================================
====================================================凑字数,博客园代码块里的文字不算字数,这个有点坑===================================================================
====================================================凑字数,博客园代码块里的文字不算字数,这个有点坑===================================================================
====================================================凑字数,博客园代码块里的文字不算字数,这个有点坑===================================================================
====================================================凑字数,博客园代码块里的文字不算字数,这个有点坑===================================================================
====================================================凑字数,博客园代码块里的文字不算字数,这个有点坑===================================================================
====================================================凑字数,博客园代码块里的文字不算字数,这个有点坑===================================================================
====================================================凑字数,博客园代码块里的文字不算字数,这个有点坑===================================================================
====================================================凑字数,博客园代码块里的文字不算字数,这个有点坑===================================================================
====================================================凑字数,博客园代码块里的文字不算字数,这个有点坑===================================================================
====================================================凑字数,博客园代码块里的文字不算字数,这个有点坑===================================================================
====================================================凑字数,博客园代码块里的文字不算字数,这个有点坑===================================================================
====================================================凑字数,博客园代码块里的文字不算字数,这个有点坑===================================================================
====================================================凑字数,博客园代码块里的文字不算字数,这个有点坑===================================================================
====================================================凑字数,博客园代码块里的文字不算字数,这个有点坑===================================================================
====================================================凑字数,博客园代码块里的文字不算字数,这个有点坑===================================================================
====================================================凑字数,博客园代码块里的文字不算字数,这个有点坑===================================================================
====================================================凑字数,博客园代码块里的文字不算字数,这个有点坑===================================================================
====================================================凑字数,博客园代码块里的文字不算字数,这个有点坑===================================================================