目标:
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. celery执行异步任务和定时任务

    一.什么是Clelery Celery是一个简单.灵活且可靠的,处理大量消息的分布式系统 专注于实时处理的异步任务队列 同时也支持任务调度 Celery架构 Celery的架构由三部分组成,消息中间件 ...

  2. Hazelcast介绍

    Hazelcast介绍 什么时侯需要用例 内存中分布式计算 场景分布式消息 特性 全景 Distributed Maps 一个结点中分区 Hazelcast中的分片也称为分区,Hazelcast默认2 ...

  3. 新手学Html之JSP基础语法——入门(二)

    JSP基础语法 JSP注释 comment.jsp <%@ page language="java" contentType="text/html; charset ...

  4. C#的语法----程序结构(1)

    接下来的内容是整个C#学习的脉络,它将各个知识点串联了起来,是整个C#的重点,所以篇幅较长. 首先,我们类比一下PLC和C#执行代码的方式,其实不难发现都是顺序扫描,以Main为程序入口,从上到下一行 ...

  5. [洛谷P1122][题解]最大子树和

    这是一道还算简单的树型dp. 转移方程:f[i]=max(f[j],0) 其中i为任意非叶节点,j为i的一棵子树,而每棵子树都有选或不选两种选择 具体看代码: #include<bits/std ...

  6. JSON.parse解决Unexpected token ' in JSON at position 1报错

     壹 ❀ 引 我们知道JSON.parse能将JSON字符串转变成JS对象,但在一些转换中可能出现Unexpected token ' in JSON at position 1的错误,这是因为被转换 ...

  7. 使用脚本进行ansible批量主机的免密配置

    应用场景: 在应用ansible的实际情况中,有一个很现实的问题,ansible是需要对主机做ssh免密登陆的,而挨个对主机做免密是非常的繁琐的,挨个敲IP不仅非常的繁琐而且容易出错,为解决这个问题, ...

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

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

  9. Spring Boot Redis 解析

    redis使用示例 本示例主要内容 使用lettuce操作redis redis字符串存储(RedisStringController.java) redis对象存储(RedisObjectContr ...

  10. Maven学习 --- <distributionManagement>

    在使用maven过程中,我们在开发阶段经常性的会有很多公共库处于不稳定状态,随时需要修改并发布,可能一天就要发布一次,遇到bug时,甚至一天要发布N次.我们知道,maven的依赖管理是基于版本管理的, ...