定时任务

1、常用定时任务

(1)Java自带的java.util.Timer类
timer:配置比较麻烦,时间延后问题
timertask:不推荐
(2)Quartz框架
配置更简单(SSM)
xml或者注解
(3)SpringBoot使用注解方式开启定时任务
启动类里面 @EnableScheduling开启定时任务,自动扫描
定时任务业务类 加注解 @Component被容器扫描
定时执行的方法加上注解 @Scheduled(fixedRate=2000) 定期执行一次

2、定时实例:2秒定时打印当前时间

(1)每2秒定时打印当前时间,测试

@Component
public class TestTask {
	@Scheduled(fixedRate = 2000) // 两秒执行一次
	public void sum() {
		if(stop==true){
			return;
		}
		System.out.println("当前时间:" + new Date());
	}
}

(2)可以控制开始和停止

@Component
public class TestTask {
	private boolean stop;
	public TestTask() {
		super();
		stop=false;
	}
	@Scheduled(fixedRate = 2000) // 两秒执行一次
	public void sum() {
		if(stop==true){
			return;
		}
		System.out.println("当前时间:" + new Date());
	}
	public String stopCron() {
		if (stop ==false) {
			stop=true;
		}
		System.out.println("DynamicTask.stopCron()"+stop);
		return "stopCron";
	}
	public String startCron() {
		if (stop ==true) {
			stop=false;
		}
		System.out.println("DynamicTask.startCron()"+stop);
		return "startCron";
	}
}

@RestController
@RequestMapping(value="/api/v1/test")
public class TestController {
	@Autowired
	TestTask testTask;
	@RequestMapping("/stopCron")
    public String stopCron() {
		return testTask.stopCron();
    }	
	@RequestMapping("/startCron")
    public String startCron() {
		return testTask.startCron();
    }
}

3、定时任务表达式配置

cron 定时任务表达式 @Scheduled(cron="*/1 * * * * *") 表示每秒
fixedRate: 定时多久执行一次(上一次开始执行时间点后xx秒再次执行;)
fixedDelay: 上一次执行结束时间点后xx秒再次执行
fixedDelayString:  字符串形式,可以通过配置文件指定
每天的下午3点30分执行
	@Scheduled(cron = "0 30 15 * * ?")
	public void sum() {
		if(stop==true){
			return;
		}
		System.out.println("当前时间:" + new Date());
	}

4、邮件开启POP3/SMTP服务:

注意开启完之后,QQ邮箱会生成一个授权码,在代码里连接邮箱使用这个授权码而不是原始的邮箱密码,这样可以避免使用明文密码。

5、springboot整合邮件发送

(1)pom.xml

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

(2)application.properties

spring.mail.host=smtp.qq.com
spring.mail.username=249811636@qq.com
spring.mail.password=****************

(3)发送邮件接口

@RestController
@RequestMapping(value="email")
public class EmailController {
	@Value("${spring.mail.username}")
	private String sendName;
	@Autowired
	private JavaMailSender javaMailSender;
    @RequestMapping("send")
    public JsonData sendMail03(){
        MimeMessage mMessage=javaMailSender.createMimeMessage();//创建邮件对象
        MimeMessageHelper mMessageHelper;
        Properties prop = new Properties();
        try {
            mMessageHelper=new MimeMessageHelper(mMessage,true);
            mMessageHelper.setFrom(sendName);//发件人邮箱
            mMessageHelper.setTo("249811636@qq.com");//收件人邮箱
            mMessageHelper.setSubject("会员卡即将到期提醒");//邮件的主题
            mMessageHelper.setText("会员卡即将到期提醒");
            javaMailSender.send(mMessage);//发送邮件
        } catch (MessagingException e) {
            e.printStackTrace();
            return new JsonData(0, "邮件发送失败", null);
        }
		return new JsonData(0, "邮件发送成功", null);
    }
}

(4)测试

6、实验:在用户的用户卡过期前一天发送邮件提醒

posted @ 2023-02-07 19:03  阳光宅男6  阅读(47)  评论(0编辑  收藏  举报