springboot系列九,springboot整合郵件服務、整合定時任務排程
阿新 • • 發佈:2018-12-28
一、整合郵件服務
如果要進行郵件的整合處理,那麼你一定需要有一個郵件伺服器,實際上 java 本身提供有一套 JavaMail 元件以實現郵件伺服器的搭建,但是這個搭建的伺服器意義不大,因為你現在搭建完成了,向一些大型的站點發送一封郵件,若干小時你就會被拉黑, 如果不想拉黑彼此之間就做一個白名單即可。
要傳送郵件,首先要知道郵件伺服器,相當於我們是往對方的郵件伺服器傳送了一個請求。再一個,要有一個發件人。所以我們先用自己的賬號密碼登陸郵件伺服器,再用登陸的郵件伺服器給目標郵箱傳送一個郵件。下面以163郵件為例。
1、新增依賴
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-mail</artifactId> </dependency>
2、新增yml
spring: mail: host: smtp.163.com port: 25 username: [email protected]163.com password: xxxxxxx properties: mail.smtp.auth:true mail.smtp.starttls.enable: true mail.smtp.starttls.required: true
3、傳送示例
@Resource private JavaMailSender javaMailSender ; @Test public void testSendMail() { SimpleMailMessage message = new SimpleMailMessage() ; // 要傳送的訊息內容 message.setFrom("[email protected]"); message.setTo("[email protected]"); message.setSubject("測試郵件)"); message.setText("好好學習,天天向上"); this.javaMailSender.send(message); }
二、整合定時任務
所有的系統開發裡面定時排程絕對是一個核心的話題,對於定時排程的實現在實際開發之中可以使用:TimerTask、Quartz、 SpringTask 配置,實際上這裡面最簡單的配置就是 Spring 自己所提供的 Task 處理。
1、配置定時任務元件
MyTask.java
package com.example.demo.task; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; import java.text.SimpleDateFormat; import java.util.Date; @Component public class MyTask { @Scheduled(fixedRate = 2000) // 採用間隔排程,每2秒執行一次 public void runJobA() { // 定義一個要執行的任務 System.out.println("【*** MyTaskA - 間隔排程 ***】" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS") .format(new Date())); } @Scheduled(cron = "* * * * * ?") // 每秒呼叫一次 public void runJobB() { System.err.println("【*** MyTaskB - 間隔排程 ***】" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS") .format(new Date())); } }
2、啟動類開啟定時任務
@SpringBootApplication @Import({SmsConfig.class}) @MapperScan("com.example.*.dao") @EnableScheduling // 啟用間隔排程 public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } }
當前任務排程只是序列任務排程,只有一個執行緒在工作,也就是說所有的任務是一個一個執行的處理方式,那麼如果現在有一個任務所花費的時間特別的長,則其它的任務都會積壓,實際開發之中很明顯這種處理是不可能存在的。
如果要想啟用並行的排程處理,則一定要準備出一個執行緒排程池,進行一個執行緒排程的配置類:
3、配置執行緒池
package com.example.demo.task; import java.util.concurrent.Executors; import org.springframework.context.annotation.Configuration; import org.springframework.scheduling.annotation.SchedulingConfigurer; import org.springframework.scheduling.config.ScheduledTaskRegistrar; @Configuration // 定時排程的配置類一定要實現指定的父介面 public class SchedulerConfig implements SchedulingConfigurer { @Override public void configureTasks(ScheduledTaskRegistrar taskRegistrar) { // 開啟一個執行緒排程池 taskRegistrar.setScheduler(Executors.newScheduledThreadPool(10)); } }
注:如果覺得定時任務cron表示式每次初始化時已經確定了,維護起來不方便,可以考慮使用spring+quartz,把定時任務持久化到資料庫中。參考: