SpringBoot(十七)——————异步任务、定时任务、邮件任务

源码地址:https://github.com/877148107/springboot_integrate/tree/master/springboot-integrate-task

 

目录

异步任务

定时任务

1、cron表达式

 邮件任务

1、引入发送邮件的starter

2、自动配置类MailSenderAutoConfiguration 

3、邮件发送的组件JavaMailSenderImpl

4、邮件发送的属性配置MailProperties

5、测试邮件发送


 

  • 异步任务

在Java应用中,绝大多数情况下都是通过同步的方式来实现交互处理的;但是在处理与第三方系统交互的时候,容易造成响应迟缓的情况,之前大部分都是使用多线程来完成此类任务,其实,在Spring 3.x之后,就已经内置了@Async来完美解决这个问题。

两个注解:

@EnableAysnc:开启异步处理

@EnableAsync
@SpringBootApplication
public class SpringbootIntegrateTaskApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringbootIntegrateTaskApplication.class, args);
    }

}

@Aysnc:标识为异步进行

@RestController
public class AsyncController {

    @Autowired
    AsyncService asyncService;

    @RequestMapping("/hello")
    public String sayHello(){
        asyncService.sayHello();
        return LocalDateTime.now()+"hello AsyncService。。。。。。";
    }
}
  • 定时任务

项目开发中经常需要执行一些定时任务,比如需要在每天凌晨时候,分析一次前一天的日志信息。Spring为我们提供了异步执行任务调度的方式,提供TaskExecutor 、TaskScheduler 接口。

两个注解:

@EnableScheduling:开启定时任务

@EnableScheduling
@SpringBootApplication
public class SpringbootIntegrateTaskApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringbootIntegrateTaskApplication.class, args);
    }

}

@Scheduled:定时任务执行

@Service
public class ScheduledService {
    /**
     * second(秒), minute(分), hour(时), day of month(日), month(月), day of week(周几).
     * 0 * * * * MON-FRI
     *  【0 0/5 14,18 * * ?】 每天14点整,和18点整,每隔5分钟执行一次
     *  【0 15 10 ? * 1-6】 每个月的周一至周六10:15分执行一次
     *  【0 0 2 ? * 6L】每个月的最后一个周六凌晨2点执行一次
     *  【0 0 2 LW * ?】每个月的最后一个工作日凌晨2点执行一次
     *  【0 0 2-4 ? * 1#1】每个月的第一个周一凌晨2点到4点期间,每个整点都执行一次;
     */
    // @Scheduled(cron = "0 * * * * MON-SAT")
    //@Scheduled(cron = "0,1,2,3,4 * * * * MON-SAT")
    // @Scheduled(cron = "0-4 * * * * MON-SAT")
    @Scheduled(cron = "0/4 * * * * 0-7")  //每4秒执行一次
    public void hello(){
        System.out.println("hello ... ");
    }
}

1、cron表达式

字段

允许值

允许的特殊字符

 

特殊字符

代表含义

0-59

, - * /

 

,

枚举

0-59

, - * /

 

-

区间

小时

0-23

, - * /

 

*

任意

日期

1-31

, - * ? / L W C

 

/

步长

月份

1-12

, - * /

 

?

日/星期冲突匹配

星期

0-7或SUN-SAT 0,7是SUN

, - * ? / L C #

 

L

最后

       

W

工作日

       

C

和calendar联系后计算过的值

       

#

星期,4#2,第2个星期四

 

 

 

 

 

 

 

 

 

 

  •  邮件任务

1、引入发送邮件的starter


	org.springframework.boot
	spring-boot-starter-mail

2、自动配置类MailSenderAutoConfiguration 

@Configuration(proxyBeanMethods = false)
@ConditionalOnClass({ MimeMessage.class, MimeType.class, MailSender.class })
@ConditionalOnMissingBean(MailSender.class)
@Conditional(MailSenderCondition.class)
@EnableConfigurationProperties(MailProperties.class)
@Import({ MailSenderJndiConfiguration.class, MailSenderPropertiesConfiguration.class })
public class MailSenderAutoConfiguration {

3、邮件发送的组件JavaMailSenderImpl

@Configuration(proxyBeanMethods = false)
@ConditionalOnProperty(prefix = "spring.mail", name = "host")
class MailSenderPropertiesConfiguration {

	@Bean
	@ConditionalOnMissingBean(JavaMailSender.class)
	JavaMailSenderImpl mailSender(MailProperties properties) {
		JavaMailSenderImpl sender = new JavaMailSenderImpl();
		applyProperties(properties, sender);
		return sender;
	}

4、邮件发送的属性配置MailProperties

@ConfigurationProperties(prefix = "spring.mail")
public class MailProperties {

	private static final Charset DEFAULT_CHARSET = StandardCharsets.UTF_8;

	/**
	 * SMTP server host. For instance, `smtp.example.com`.
	 */
	private String host;

	/**
	 * SMTP server port.
	 */
	private Integer port;

	/**
	 * Login user of the SMTP server.
	 */
	private String username;

	/**
	 * Login password of the SMTP server.
	 */
	private String password;

	/**
	 * Protocol used by the SMTP server.
	 */
	private String protocol = "smtp";

	/**
	 * Default MimeMessage encoding.
	 */
	private Charset defaultEncoding = DEFAULT_CHARSET;

	/**
	 * Additional JavaMail Session properties.
	 */
	private Map properties = new HashMap<>();

	/**
	 * Session JNDI name. When set, takes precedence over other Session settings.
	 */
	private String jndiName;
#配置邮箱地址
[email protected]
#配置邮箱密码
spring.mail.password=123456
#配置邮箱的host
spring.mail.host=smtp.qq.com

5、测试邮件发送

@SpringBootTest
class SpringbootIntegrateTaskApplicationTests {

    @Autowired
    JavaMailSender mailSender;

    /**
     * 测试发送邮件
     */
    @Test
    void contextLoads() {
        SimpleMailMessage message = new SimpleMailMessage();
        //主题
        message.setSubject("放假通知");
        //内容
        message.setText("4月4、5、6放假三天");

        //发送给谁
        message.setTo("[email protected]");
        //从谁发送
        message.setFrom("[email protected]");

        mailSender.send(message);
    }


    /**
     * 测试发送复杂邮件
     */
    @Test
    public void testSendEmail() throws Exception{
        //创建一个复杂的消息邮件
        MimeMessage mailMessage = mailSender.createMimeMessage();
        MimeMessageHelper helper = new MimeMessageHelper(mailMessage,true);


        //主题
        helper.setSubject("放假通知");
        //内容
        helper.setText("

4月4、5、6放假三天

",true); //发送给谁 helper.setTo("[email protected]"); //从谁发送 helper.setFrom("[email protected]"); //上传附件 helper.addAttachment("1.jpg",new File("C:\\Users\\a\\Desktop\\1.jpg")); mailSender.send(mailMessage); } }

SpringBoot(十七)——————异步任务、定时任务、邮件任务_第1张图片

SpringBoot(十七)——————异步任务、定时任务、邮件任务_第2张图片

你可能感兴趣的:(SpringBoot)