diff --git a/README.md b/README.md new file mode 100644 index 0000000..1b08aaa --- /dev/null +++ b/README.md @@ -0,0 +1,27 @@ +## 参考文章 + + +1、SpringBoot2.0 整合 shard-jdbc 中间件,实现数据分库分表
+ + +2、SpringBoot2.0 整合 JavaMail ,实现异步发送邮件功能
+ + +3、SpringBoot2.0 整合 RocketMQ ,实现请求异步处理
+ + +4、SpringBoot2.0 整合 Swagger2 ,构建接口管理界面
+ + +5、SpringBoot2.0 整合 QuartJob ,实现定时器实时管理
+ +## 项目简介 +SpringBoot 集成常用中间件 + +SpringBoot集成常用开发中间件,分库分表,缓存,消息队列,定时器,权限管理等组件 + +# 我的公众号 +关注公众号:知了一笑
+ + + diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..e66d22a --- /dev/null +++ b/pom.xml @@ -0,0 +1,218 @@ + + + + + org.springframework.boot + spring-boot-starters + 2.1.3.RELEASE + + + 4.0.0 + com.boot.parent + middle-ware-parent + 1.0-SNAPSHOT + pom + + + + + ware-quart-job + + ware-rocket-queue + + ware-shard-jdbc + + + + ware-email-send + + ware-swagger-two + + + + + UTF-8 + UTF-8 + 1.8 + 2.1.3.RELEASE + 5.1.5.RELEASE + 3.0.7.1 + 5.1.38 + 4.0 + 1.1.13 + 2.3.0 + 2.6 + 1.2.2 + 2.5 + 1.10 + 1.10 + 2.6.1 + 2.9.9 + 1.2.47 + 4.1.1 + 1.18.4 + 1.2.5 + 1.0.3 + 3.8.1 + 4.3.0 + 3.1.0 + 2.9.1 + 1.5.0-b01 + + + + + + + org.springframework.boot + spring-boot-starter-test + test + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-data-redis + + + org.springframework.boot + spring-boot-starter-aop + + + org.springframework + spring-context-support + + + org.springframework.boot + spring-boot-configuration-processor + true + + + com.baomidou + mybatis-plus-boot-starter + ${mybatisplus.version} + + + com.baomidou + mybatis-plus-generator + + + + + com.baomidou + mybatis-plus + ${mybatisplus.version} + + + com.github.pagehelper + pagehelper-spring-boot-starter + ${pagehelper.version} + + + mysql + mysql-connector-java + ${mysql.version} + + + com.alibaba + druid-spring-boot-starter + ${druid.version} + + + org.quartz-scheduler + quartz + ${quartz.version} + + + com.mchange + c3p0 + + + + + commons-lang + commons-lang + ${commons.lang.version} + + + commons-fileupload + commons-fileupload + ${commons.fileupload.version} + + + commons-io + commons-io + ${commons.io.version} + + + commons-codec + commons-codec + ${commons.codec.version} + + + commons-configuration + commons-configuration + ${commons.configuration.version} + + + io.springfox + springfox-swagger2 + ${swagger.version} + + + io.springfox + springfox-swagger-ui + ${swagger.version} + + + joda-time + joda-time + ${joda.time.version} + + + com.alibaba + fastjson + ${fastjson.version} + + + cn.hutool + hutool-all + ${hutool.version} + + + org.projectlombok + lombok + ${lombok.version} + + + tool + common-util + ${common-util.version} + + + org.apache.commons + commons-lang3 + ${commons-lang3.version} + + + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 2.3.2 + + 1.8 + 1.8 + + + + + \ No newline at end of file diff --git a/ware-email-send/pom.xml b/ware-email-send/pom.xml new file mode 100644 index 0000000..e6e2de8 --- /dev/null +++ b/ware-email-send/pom.xml @@ -0,0 +1,57 @@ + + + + middle-ware-parent + com.boot.parent + 1.0-SNAPSHOT + + 4.0.0 + + com.email.send + ware-email-send + jar + + + + org.springframework.boot + spring-boot-starter-web + ${spring-boot.version} + + + org.springframework.boot + spring-boot-starter-test + ${spring-boot.version} + test + + + org.springframework.boot + spring-boot-starter-aop + ${spring-boot.version} + + + org.springframework.boot + spring-boot-configuration-processor + ${spring-boot.version} + true + + + org.springframework + spring-context-support + ${spring.version} + + + joda-time + joda-time + ${joda.time.version} + + + + javax.mail + mail + ${mail.version} + + + + \ No newline at end of file diff --git a/ware-email-send/src/gzh.jpg b/ware-email-send/src/gzh.jpg new file mode 100644 index 0000000..df52b12 Binary files /dev/null and b/ware-email-send/src/gzh.jpg differ diff --git a/ware-email-send/src/gzh.zip b/ware-email-send/src/gzh.zip new file mode 100644 index 0000000..fef02e0 Binary files /dev/null and b/ware-email-send/src/gzh.zip differ diff --git a/ware-email-send/src/main/java/com/email/send/EmailApplication.java b/ware-email-send/src/main/java/com/email/send/EmailApplication.java new file mode 100644 index 0000000..678ded2 --- /dev/null +++ b/ware-email-send/src/main/java/com/email/send/EmailApplication.java @@ -0,0 +1,13 @@ +package com.email.send; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.scheduling.annotation.EnableAsync; + +@EnableAsync +@SpringBootApplication +public class EmailApplication { + public static void main(String[] args) { + SpringApplication.run(EmailApplication.class,args) ; + } +} diff --git a/ware-email-send/src/main/java/com/email/send/controller/EmailController.java b/ware-email-send/src/main/java/com/email/send/controller/EmailController.java new file mode 100644 index 0000000..83ca68e --- /dev/null +++ b/ware-email-send/src/main/java/com/email/send/controller/EmailController.java @@ -0,0 +1,28 @@ +package com.email.send.controller; + +import com.email.send.model.SendEmailModel; +import com.email.send.param.EmailType; +import com.email.send.service.EmailService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import javax.annotation.Resource; + +@RestController +public class EmailController { + + private static final Logger LOGGER = LoggerFactory.getLogger(EmailController.class) ; + + @Resource + private EmailService emailService ; + + @RequestMapping("/sendEmail") + public String sendEmail (){ + SendEmailModel model = new SendEmailModel() ; + model.setReceiver("xxxxx@qq.com"); + emailService.sendEmail(EmailType.EMAIL_TEXT_KEY.getCode(),model); + LOGGER.info("执行结束====>>"); + return "success" ; + } +} diff --git a/ware-email-send/src/main/java/com/email/send/model/SendEmailModel.java b/ware-email-send/src/main/java/com/email/send/model/SendEmailModel.java new file mode 100644 index 0000000..503f385 --- /dev/null +++ b/ware-email-send/src/main/java/com/email/send/model/SendEmailModel.java @@ -0,0 +1,26 @@ +package com.email.send.model; + +/** + * 邮件发送参数封装 + */ +public class SendEmailModel { + + public static final String EMAIL_TEXT_KEY = "email_balance_key" ; + public static final String EMAIL_IMAGE_KEY = "email_req_num_key" ; + public static final String EMAIL_FILE_KEY = "email_open_account_key" ; + + /** + * 收件人邮箱 + */ + private String receiver ; + + + public String getReceiver() { + return receiver; + } + + public void setReceiver(String receiver) { + this.receiver = receiver; + } + +} diff --git a/ware-email-send/src/main/java/com/email/send/param/BodyType.java b/ware-email-send/src/main/java/com/email/send/param/BodyType.java new file mode 100644 index 0000000..53fd732 --- /dev/null +++ b/ware-email-send/src/main/java/com/email/send/param/BodyType.java @@ -0,0 +1,41 @@ +package com.email.send.param; + +public enum BodyType { + + EMAIL_TEXT_BODY("email_text_key","您好:%s,我是:%s"), + EMAIL_IMAGE_BODY("email_image_key","图片名称:%s"), + EMAIL_FILE_BODY("email_file_key","文件名称:%s"); + + private String code ; + private String value ; + BodyType (String code,String value){ + this.code = code ; + this.value = value ; + } + + public static String getByCode (String code){ + BodyType[] values = BodyType.values() ; + for (BodyType bodyType : values) { + if (bodyType.code.equalsIgnoreCase(code)){ + return bodyType.value ; + } + } + return null ; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } +} diff --git a/ware-email-send/src/main/java/com/email/send/param/EmailParam.java b/ware-email-send/src/main/java/com/email/send/param/EmailParam.java new file mode 100644 index 0000000..4810a7b --- /dev/null +++ b/ware-email-send/src/main/java/com/email/send/param/EmailParam.java @@ -0,0 +1,34 @@ +package com.email.send.param; + +/** + * 邮箱发送参数配置 + */ +public class EmailParam { + /** + * 邮箱服务器地址 + */ + // public static final String emailHost = "smtp.mxhichina.com" ; 阿里云企业邮箱配置(账号+密码) + // public static final String emailHost = "smtp.aliyun.com" ; 阿里云个人邮箱配置(账号+密码) + public static final String emailHost = "smtp.163.com" ; // 网易邮箱配置(账号+授权码) + /** + * 邮箱协议 + */ + public static final String emailProtocol = "smtp" ; + /** + * 邮箱发件人 + */ + public static final String emailSender = "xxxxxx@163.com" ; + /** + * 邮箱授权码 + */ + public static final String password = "authCode"; + /** + * 邮箱授权 + */ + public static final String emailAuth = "true" ; + /** + * 邮箱昵称 + */ + public static final String emailNick = "知了一笑" ; + +} diff --git a/ware-email-send/src/main/java/com/email/send/param/EmailType.java b/ware-email-send/src/main/java/com/email/send/param/EmailType.java new file mode 100644 index 0000000..3807693 --- /dev/null +++ b/ware-email-send/src/main/java/com/email/send/param/EmailType.java @@ -0,0 +1,44 @@ +package com.email.send.param; + +/** + * 邮件发送类型 + */ +public enum EmailType { + + EMAIL_TEXT_KEY("email_text_key","文本邮件"), + EMAIL_IMAGE_KEY("email_image_key","图片邮件"), + EMAIL_FILE_KEY("email_file_key","文件邮件"); + + private String code ; + private String value ; + EmailType (String code,String value){ + this.code = code ; + this.value = value ; + } + + public static String getByCode (String code){ + EmailType[] values = EmailType.values() ; + for (EmailType emailType : values) { + if (emailType.code.equalsIgnoreCase(code)){ + return emailType.value ; + } + } + return null ; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } +} diff --git a/ware-email-send/src/main/java/com/email/send/service/EmailService.java b/ware-email-send/src/main/java/com/email/send/service/EmailService.java new file mode 100644 index 0000000..332ae3a --- /dev/null +++ b/ware-email-send/src/main/java/com/email/send/service/EmailService.java @@ -0,0 +1,7 @@ +package com.email.send.service; + +import com.email.send.model.SendEmailModel; + +public interface EmailService { + void sendEmail (String emailKey, SendEmailModel model) ; +} diff --git a/ware-email-send/src/main/java/com/email/send/service/impl/EmailServiceImpl.java b/ware-email-send/src/main/java/com/email/send/service/impl/EmailServiceImpl.java new file mode 100644 index 0000000..3d4a95a --- /dev/null +++ b/ware-email-send/src/main/java/com/email/send/service/impl/EmailServiceImpl.java @@ -0,0 +1,33 @@ +package com.email.send.service.impl; + +import com.email.send.model.SendEmailModel; +import com.email.send.param.BodyType; +import com.email.send.param.EmailType; +import com.email.send.service.EmailService; +import com.email.send.util.EmailUtil; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Component; +import org.springframework.stereotype.Service; + +@Component +@Service +public class EmailServiceImpl implements EmailService { + + @Async("taskExecutor") + @Override + public void sendEmail(String emailKey, SendEmailModel model) { + try{ + // 异步执行 + Thread.sleep(1000); + String textBody = EmailUtil.convertTextModel(BodyType.getByCode(emailKey),"知了","一笑"); + // 发送文本邮件 + EmailUtil.sendEmail01(model.getReceiver(), EmailType.getByCode(emailKey),textBody); + // 发送复杂邮件:文本+图片+附件 + String body = "自定义图片:,网络图片:"; + // EmailUtil.sendEmail02(model.getReceiver(),"文本+图片+附件",body); + } catch (Exception e){ + e.printStackTrace(); + } + + } +} diff --git a/ware-email-send/src/main/java/com/email/send/util/EmailUtil.java b/ware-email-send/src/main/java/com/email/send/util/EmailUtil.java new file mode 100644 index 0000000..4b71732 --- /dev/null +++ b/ware-email-send/src/main/java/com/email/send/util/EmailUtil.java @@ -0,0 +1,160 @@ +package com.email.send.util; + +import com.email.send.param.EmailParam; + +import javax.activation.DataHandler; +import javax.activation.FileDataSource; +import javax.mail.Message; +import javax.mail.Session; +import javax.mail.Transport; +import javax.mail.internet.InternetAddress; +import javax.mail.internet.MimeBodyPart; +import javax.mail.internet.MimeMessage; +import javax.mail.internet.MimeMultipart; +import java.io.FileOutputStream; +import java.util.Properties; + +/** + * 邮箱发送工具类 + */ +public class EmailUtil { + + public static void main(String[] args) throws Exception { + sendEmail01("dzyaly@aliyun.com","复杂邮件","自定义图片:,网络图片:") ; + } + + /** + * 邮箱发送模式01:纯文本格式 + */ + public static void sendEmail01 (String receiver,String title,String body) throws Exception { + Properties prop = new Properties(); + prop.setProperty("mail.host", EmailParam.emailHost); + prop.setProperty("mail.transport.protocol", EmailParam.emailProtocol); + prop.setProperty("mail.smtp.auth", EmailParam.emailAuth); + //使用JavaMail发送邮件的5个步骤 + //1、创建session + Session session = Session.getInstance(prop); + //开启Session的debug模式,这样就可以查看到程序发送Email的运行状态 + session.setDebug(true); + //2、通过session得到transport对象 + Transport ts = session.getTransport(); + //3、使用邮箱的用户名和密码连上邮件服务器,发送邮件时,发件人需要提交邮箱的用户名和密码给smtp服务器,用户名和密码都通过验证之后才能够正常发送邮件给收件人。 + ts.connect(EmailParam.emailHost, EmailParam.emailSender, EmailParam.password); + //4、创建邮件 + // Message message = createEmail01(session,receiver,title,body); + Message message = createEmail01(session,receiver,title,body); + //5、发送邮件 + ts.sendMessage(message, message.getAllRecipients()); + ts.close(); + } + + /** + * 邮箱发送模式02:复杂格式 + */ + public static void sendEmail02 (String receiver,String title,String body) throws Exception { + Properties prop = new Properties(); + prop.setProperty("mail.host", EmailParam.emailHost); + prop.setProperty("mail.transport.protocol", EmailParam.emailProtocol); + prop.setProperty("mail.smtp.auth", EmailParam.emailAuth); + //使用JavaMail发送邮件的5个步骤 + //1、创建session + Session session = Session.getInstance(prop); + //开启Session的debug模式,这样就可以查看到程序发送Email的运行状态 + session.setDebug(true); + //2、通过session得到transport对象 + Transport ts = session.getTransport(); + //3、使用邮箱的用户名和密码连上邮件服务器,发送邮件时,发件人需要提交邮箱的用户名和密码给smtp服务器,用户名和密码都通过验证之后才能够正常发送邮件给收件人。 + ts.connect(EmailParam.emailHost, EmailParam.emailSender, EmailParam.password); + //4、创建邮件 + // Message message = createEmail01(session,receiver,title,body); + Message message = createEmail02(session,receiver,title,body); + //5、发送邮件 + ts.sendMessage(message, message.getAllRecipients()); + ts.close(); + } + + /** + * 创建文本邮件 + */ + private static MimeMessage createEmail01(Session session,String receiver,String title,String body) + throws Exception { + //创建邮件对象 + MimeMessage message = new MimeMessage(session); + //指明邮件的发件人 + String nick = javax.mail.internet.MimeUtility.encodeText(EmailParam.emailNick); + message.setFrom(new InternetAddress(nick+"<"+EmailParam.emailSender+">")); + //指明邮件的收件人 + message.setRecipient(Message.RecipientType.TO, new InternetAddress(receiver)); + //邮件的标题 + message.setSubject(title); + //邮件的文本内容 + message.setContent(body, "text/html;charset=UTF-8"); + //返回创建好的邮件对象 + return message; + } + + private static MimeMessage createEmail02 (Session session,String receiver,String title,String body) + throws Exception{ + //创建邮件对象 + MimeMessage message = new MimeMessage(session); + //指明邮件的发件人 + String nick = javax.mail.internet.MimeUtility.encodeText(EmailParam.emailNick); + message.setFrom(new InternetAddress(nick+"<"+EmailParam.emailSender+">")); + //指明邮件的收件人 + message.setRecipient(Message.RecipientType.TO, new InternetAddress(receiver)); + //邮件的标题 + message.setSubject(title); + //文本内容 + MimeBodyPart text = new MimeBodyPart() ; + text.setContent(body,"text/html;charset=UTF-8"); + //图片内容 + MimeBodyPart image = new MimeBodyPart(); + image.setDataHandler(new DataHandler(new FileDataSource("ware-email-send/src/gzh.jpg"))); + image.setContentID("gzh.jpg"); + //附件内容 + MimeBodyPart attach = new MimeBodyPart(); + DataHandler file = new DataHandler(new FileDataSource("ware-email-send/src/gzh.zip")); + attach.setDataHandler(file); + attach.setFileName(file.getName()); + //关系:正文和图片 + MimeMultipart multipart1 = new MimeMultipart(); + multipart1.addBodyPart(text); + multipart1.addBodyPart(image); + multipart1.setSubType("related"); + //关系:正文和附件 + MimeMultipart multipart2 = new MimeMultipart(); + multipart2.addBodyPart(attach); + // 全文内容 + MimeBodyPart content = new MimeBodyPart(); + content.setContent(multipart1); + multipart2.addBodyPart(content); + multipart2.setSubType("mixed"); + // 封装 MimeMessage 对象 + message.setContent(multipart2); + message.saveChanges(); + // 本地查看文件格式 + message.writeTo(new FileOutputStream("F:\\MixedMail.eml")); + //返回创建好的邮件对象 + return message; + } + + /** + * 文本邮箱模板 + */ + public static String convertTextModel (String body,String param1,String param2){ + return String.format(body,param1,param2) ; + } + /** + * 图片邮箱模板 + */ + public static String convertImageModel (String body,String param1){ + return String.format(body,param1) ; + } + /** + * 文件邮箱模板 + */ + public static String convertFileModel (String body,String param1){ + return String.format(body,param1) ; + } + +} diff --git a/ware-email-send/src/main/java/com/email/send/util/TaskPoolConfig.java b/ware-email-send/src/main/java/com/email/send/util/TaskPoolConfig.java new file mode 100644 index 0000000..c58dcde --- /dev/null +++ b/ware-email-send/src/main/java/com/email/send/util/TaskPoolConfig.java @@ -0,0 +1,39 @@ +package com.email.send.util; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; +import java.util.concurrent.Executor; +import java.util.concurrent.ThreadPoolExecutor; + +/** + * 定义异步任务执行线程池 + */ +@Configuration +public class TaskPoolConfig { + @Bean("taskExecutor") + public Executor taskExecutor () { + ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); + // 核心线程数10:线程池创建时候初始化的线程数 + executor.setCorePoolSize(10); + // 最大线程数20:线程池最大的线程数,只有在缓冲队列满了之后才会申请超过核心线程数的线程 + executor.setMaxPoolSize(15); + // 缓冲队列200:用来缓冲执行任务的队列 + executor.setQueueCapacity(200); + // 允许线程的空闲时间60秒:当超过了核心线程数之外的线程在空闲时间到达之后会被销毁 + executor.setKeepAliveSeconds(60); + // 线程池名的前缀:设置好了之后可以方便定位处理任务所在的线程池 + executor.setThreadNamePrefix("taskExecutor-"); + /* + 线程池对拒绝任务的处理策略:这里采用了CallerRunsPolicy策略, + 当线程池没有处理能力的时候,该策略会直接在 execute 方法的调用线程中运行被拒绝的任务; + 如果执行程序已关闭,则会丢弃该任务 + */ + executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); + // 设置线程池关闭的时候等待所有任务都完成再继续销毁其他的Bean + executor.setWaitForTasksToCompleteOnShutdown(true); + // 设置线程池中任务的等待时间,如果超过这个时候还没有销毁就强制销毁,以确保应用最后能够被关闭,而不是阻塞住。 + executor.setAwaitTerminationSeconds(600); + return executor; + } +} diff --git a/ware-email-send/src/main/resources/application.yml b/ware-email-send/src/main/resources/application.yml new file mode 100644 index 0000000..578a171 --- /dev/null +++ b/ware-email-send/src/main/resources/application.yml @@ -0,0 +1,21 @@ +# Tomcat +server: + tomcat: + uri-encoding: UTF-8 + max-threads: 1000 + min-spare-threads: 30 + port: 7005 + connection-timeout: 5000ms + servlet: + context-path: /email + +spring: + application: + name: email-send + profiles: + active: dev + servlet: + multipart: + max-file-size: 100MB + max-request-size: 100MB + enabled: true \ No newline at end of file