22. springBoot高级篇——任务

1. 异步任务

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

简单使用:

1.1 service

在需要异步执行的方法上加上注解@Async

@Service
public class TaskService {
	@Async
	public void hello(){
		try {
			Thread.sleep(5000);
		} catch (Exception e){}
		System.out.println("正在处理数据。。。");
	}
}

1.2 controller

@RestController
public class TaskController {
	@Autowired
	private TaskService taskService;

	@GetMapping("/hello")
	public String hello(){
		taskService.hello();
		return "success";
	}
}

1.3 启动类

在启动类上加上注解@EnableAysnc

@SpringBootApplication
@EnableAsync
public class Springboot04TaskApplication {
	public static void main(String[] args) {
		SpringApplication.run(Springboot04TaskApplication.class, args);
	}
}

在浏览器访问,页面很快出现success,但是控制台5s之后才打印“正在处理数据。。。”,说明程序是异步执行的。

2. 定时任务

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

        spring也为我们提供了很简便的定时任务的支持,只需要2个注解@EnableScheduling、@Scheduled即可,在主启动类上启动定时任务@EnableScheduling,在需要定时执行的方法上添加注解@Scheduled并写cron表达式。

2.1 service

@Service
public class ScheduledService {
	/*
	* 表示每个周一-周天的整秒执行
	* */
	@Scheduled(cron="0 * * * * 0-6")
	public void test(){
		System.out.println("定时任务开始执行。。。");
	}
}

2.2 启动类上添加注解@EnableScheduling

@SpringBootApplication
@EnableScheduling
public class Springboot04TaskApplication {
	public static void main(String[] args) {
		SpringApplication.run(Springboot04TaskApplication.class, args);
	}
}

启动程序,每当整秒的时候,service方法执行一次。

3. 邮件任务

3.1 引入mail启动器

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-mail</artifactId>
</dependency>

3.2 配置发件人信息

# 邮箱服务器地址
spring.mail.host=smtp.163.com
# 邮箱授权码
spring.mail.password=GGCTEDQDVLKPCIID
# 发件人邮箱
spring.mail.username=13026336905@163.com

这些配置怎么来的了?我们知道boot通过大量的自动配置来简化开发,所以对于mail来说,也有一个与之对应的自动配置类MailSenderAutoConfiguration,在该类中使用的配置类是MailProperties,在MailProperties中,定义了大量的邮件相关的属性

private static final Charset DEFAULT_CHARSET;
private String host;
private Integer port;
private String username;
private String password;
private String protocol = "smtp";
private Charset defaultEncoding;
private Map<String, String> properties;
private String jndiName;

其中有一个protocol属性值默认为smtp,所以我们发件人邮箱服务器也是用smtp服务器地址。

3.3 测试

        在MailSenderPropertiesConfiguration配置类中注入了一个邮件收发器对象JavaMailSenderImpl,该对象可用用于邮件的相关操作

3.3.1 发送简单邮件

@SpringBootTest
class Springboot04TaskApplicationTests {

	@Autowired
	private JavaMailSenderImpl sender;
	@Test
	void contextLoads() {
		SimpleMailMessage simpleMesseage = new SimpleMailMessage();
		// 设置主题
		simpleMesseage.setSubject("通知");
		// 设置正文
		simpleMesseage.setText("今天休息!");
		// 设置发件人
		simpleMesseage.setFrom("13026336905@163.com");
		// 设置收件人
		simpleMesseage.setTo("553689287@qq.com");
		simpleMesseage.setSentDate(new Date());
		sender.send(simpleMesseage);
	}

}

注意:如果邮件发送报530 SLL错误,这是说该邮件服务器是一个安全连接,这时候我们需要配置SSL开启

# 开启SSL
spring.mail.properties.mai.smtp.ssl.enable=true

3.3.2 发送MIME邮件

发送MIME邮件可以借助MimeMessageHelper来设置邮件内容

@Test
public void mail() throws Exception {
	// 创建Mime消息对象
	MimeMessage mimeMessage = sender.createMimeMessage();
	// 创建helper对象并使用helper对象设置邮件信息
	MimeMessageHelper helper = new MimeMessageHelper(mimeMessage,true);

	// 添加附件
	helper.addAttachment("2019阿里.pdf",new File("F://2019阿里最新Java编程规范.pdf"));
	helper.addAttachment("AngularJS 中文API参考手册.chm",new File("F://AngularJS 中文API参考手册.chm"));

	// 设置发件人
	helper.setFrom("13026336905@163.com");
	// 设置收件人
	helper.setTo("553689287@qq.com");
	// 设置主题
	helper.setSubject("通知");
	// 设置邮件文本类型  true表示开启html解析
	helper.setText("<span style='color:red;'><b>今天休息</b></span>",true);
	sender.send(mimeMessage);
}

运行结果:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值