目标:
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:下一步整合定时任务再配合邮件做一个完整的模块

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

springboot mail整合freemark实现动态生成模板的更多相关文章

  1. Nginx 整合 Lua 实现动态生成缩略图

    原文地址:Nginx 整合 Lua 实现动态生成缩略图 博客地址:http://www.extlight.com 一.前提 最近在开发一个项目,涉及到缩略图的功能,常见的生成缩略图的方案有以下几个: ...

  2. Java规则引擎drools:drt动态生成规则并附上具体项目逻辑

    一 整合 由于本人的码云太多太乱了,于是决定一个一个的整合到一个springboot项目里面. 附上自己的项目地址https://github.com/247292980/spring-boot 以整 ...

  3. 「快学springboot」SpringBoot整合freeMark模板引擎

    前言 虽然现在流行前后端分离开发和部署,但是有时候还是需要用到服务端渲染页面的.比如:需要考虑到SEO优化等问题的时候,FreeMark其实还是很有作用的.本人的博客本来是用React开发的,但是后来 ...

  4. SpringBoot整合MyBatisPlus配置动态数据源

    目录 SpringBoot整合MyBatisPlus配置动态数据源 SpringBoot整合MyBatisPlus配置动态数据源 推文:2018开源中国最受欢迎的中国软件MyBatis-Plus My ...

  5. Springboot】Springboot整合邮件服务(HTML/附件/模板-QQ、网易)

    介绍 邮件服务是常用的服务之一,作用很多,对外可以给用户发送活动.营销广告等:对内可以发送系统监控报告与告警. 本文将介绍Springboot如何整合邮件服务,并给出不同邮件服务商的整合配置. 如图所 ...

  6. java动态生成带下拉框的Excel导入模板

    在实际开发中,由于业务需要,常常需要进行Excel导入导出操作.以前做一些简单的导入时,先准备一个模板,再进行导入,单有十几. 二十几个导入模板时,往往要做十几.二十几个模板.而且,当在模板中需要有下 ...

  7. java根据模板HTML动态生成PDF

    原文:https://segmentfault.com/a/1190000009160184 一.需求说明:根据业务需要,需要在服务器端生成可动态配置的PDF文档,方便数据可视化查看. 二.解决方案: ...

  8. laravel发送邮件模板中点击的链接url动态生成

    邮件模板里有url链接,生成链接有三种方式(目前总结出这三种方式)这个链接可以是: http://www.xxx.com/active?id=xxx&token=xxx   这种形式是把url ...

  9. 学习SpringBoot,整合全网各种优秀资源,SpringBoot基础,中间件,优质项目,博客资源等,仅供个人学习SpringBoot使用

    学习SpringBoot,整合全网各种优秀资源,SpringBoot基础,中间件,优质项目,博客资源等,仅供个人学习SpringBoot使用 一.SpringBoot系列教程 二.SpringBoot ...

随机推荐

  1. SQL索引碎片的产生,处理过程。

    本文参考 https://www.cnblogs.com/CareySon/archive/2011/12/22/2297568.html https://www.jb51.net/softjc/12 ...

  2. Linux笔记16 使用Vsftpd服务传输文件;使用Samba或NFS实现文件共享。

    FTP协议有下面两种工作模式. 1.主动模式:FTP服务器主动向客户端发起连接请求. 2.被动模式:FTP服务器等待客户端发起连接请求(FTP的默认工作模式).Vsftpd服务程序vsftpd作为更加 ...

  3. SQL语句性能调整原则

    一.问题的提出 在应用系统开发初期,由于开发数据库数据比较少,对于查询SQL语句,复杂视图的的编写等体会不出SQL语句各种写法的性能优劣,但是如果将应用系统提交实际应用后,随着数据库中数据的增加,系统 ...

  4. java基础 - 泛型的使用

    泛型的使用方式有泛型类,泛型接口,泛型方法. 泛型的意思是把参数类型也当成参数传入,也就是在使用时(类实例化或调用方法时)传入类型. 泛型类 在实例化时传入参数类型,不能对泛型类使用instancec ...

  5. 记录自己的一次pjax性能优化

    什么是pjax? pjax = ajax + pushState 通过ajax让页面进行局部刷新,然后通过pushstate让url发生改变,再让pushState,让页面产生一个回退的记录,从而让页 ...

  6. 火车票买不到?看我用python监控票源

    同事说最近火车票难买,我就帮他用个脚本监控 一下. 最近高铁票比较难买,还有什么候补.要不停的刷,才有时候可以捡漏.有时候明明候补了,到快开车告诉你余票不足,候补失败. 凡事预则立,我打算写个脚本提前 ...

  7. 朝花夕拾《精通CSS》一、HTML & CSS 的基础

    一.背景 翻出我4年前看的<精通CSS>一书,可惜当初没有整理读书笔记的习惯,最近又很少写前端,遂很多东西.知识点遗忘了,恰且现在 css 也有些变化和进步,遂一起打包整理,输出成几篇 b ...

  8. jquery 获取元素(父节点,子节点,兄弟节点)

    费话不多说,直接上代码jquery 获取元素 $("#test1").parent(); // 父节点 $("#test1").parents(); // 全部 ...

  9. 真正的RISC-V开发板——VEGA织女星开发板开箱评测

    前言 由于最近ARM公司要求员工"停止所有与华为及其子公司正在生效的合约.支持及未决约定",即暂停与华为的相关合作,大家纷纷把注意力投向了另一个的处理器架构RISC-V,它是基于精 ...

  10. sql server多表关联update

    一般都是写的单表update语句,很少写多表关联的update,但是事实上,在SQL Server中,update的多表连接更新和select的多表连接查询在使用的方法上其实并没有多大区别. 直接上一 ...