1. 程式人生 > >springboot系列九,springboot整合郵件服務、整合定時任務排程

springboot系列九,springboot整合郵件服務、整合定時任務排程

一、整合郵件服務

   如果要進行郵件的整合處理,那麼你一定需要有一個郵件伺服器,實際上 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,把定時任務持久化到資料庫中。參考:

Quartz實現資料庫動態配置定時任務