Spring Boot----异步任务、定时任务、邮件任务、que务、定时任务、邮件任务、quertz
定时任务
使用
@EnableScheduling
//开启任务
@EnableScheduling
@SpringBootApplication
public class Springboot13Application {
public static void main(String[] args) {
SpringApplication.run(Springboot13Application.class, args);
}
}
@Scheduled
或者重新创建一个类,不在@Service中,需要使用@Component
@Service
public class TestService {
// 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点期间,每个整点都执行一次;*/
//0/4 * * * * * : 每4秒执行一次
@Scheduled(cron = "0 * * 20 8 TUE")
public void test(){
System.out.println("定时任务执行...");
}
}
定时任务的同步执行测试
执行玩test1后5秒执行test2,执行test2后2秒在执行test1,两个人任务来回交替执行
private int i;
private int k;
@Scheduled(cron = "0/1 * * * * *")
public void test() throws InterruptedException {
i++;
System.out.println("test1..."+i);
Thread.sleep(5000);
}
@Scheduled(cron = "0/1 * * * * *")
public void test2() throws InterruptedException {
k++;
System.out.println("test2..."+k);
Thread.sleep(2000);
}
定时任务的异步执行测试(方式一)
@EnableAsync
//开启异步功能
@EnableAsync
@SpringBootApplication
public class Springboot13Application {
public static void main(String[] args) {
SpringApplication.run(Springboot13Application.class, args);
}
}
@Async
@Service
public class TestService {
//表示这是一个异步方法
@Async
public void test(){
}
}
测试
两个任务同时执行
private int i;
private int k;
@Scheduled(cron = "0/1 * * * * *")
@Async
public void test() throws InterruptedException {
i++;
System.out.println("test1..."+i);
Thread.sleep(5000);
}
@Scheduled(cron = "0/1 * * * * *")
@Async
public void test2() throws InterruptedException {
k++;
System.out.println("test2..."+k);
Thread.sleep(2000);
}
多线程实现并行执行任务(方式二)
和方式一的区别,在于方式二中多个任务可以同时执行(不同任务之间相互不影响),但是,任务一必须等待任务一结束,才可以继续执行任务一
只需要创建一个配置类即可
@Configuration
@EnableScheduling。//如果启动类上有注解,应该可以不加
public class AsyncTaskConfig implements SchedulingConfigurer, AsyncConfigurer {
//线程池线程数量
private int corePoolSize = 5;
@Bean
public ThreadPoolTaskScheduler taskScheduler()
{
ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
scheduler.initialize();//初始化线程池
scheduler.setPoolSize(corePoolSize);//线程池容量
return scheduler;
}
@Override
public Executor getAsyncExecutor() {
Executor executor = taskScheduler();
return executor;
}
@Override
public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
return null;
}
@Override
public void configureTasks(ScheduledTaskRegistrar scheduledTaskRegistrar) {
scheduledTaskRegistrar.setTaskScheduler(taskScheduler());
}
}
cron表达式


关于?的问题
比如我的任务是每个月的周一10点进行调度
0 0 10 * * 1 这种写法就是错的
0 0 10 ? * 1 这种写法就是对的,因为并不是每个月中的每一天都是周一,如果天和星期冲突了,就要写出?,所以天和星期如果一个指明了,另一个没有指明,那另一个只能用?代替
邮件任务
使用
pom
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
application.properties
spring.mail.username=1847003070@qq.com spring.mail.password=xyxvywpfxzscejxx spring.mail.host=smtp.qq.com
测试
@Autowired
JavaMailSender javaMailSender;
@Test
public void test(){
//简单邮件测试
SimpleMailMessage simpleMailMessage = new SimpleMailMessage();
simpleMailMessage.setSubject("通知");
simpleMailMessage.setText("今天放假啦");
simpleMailMessage.setTo("760423314@qq.com");
simpleMailMessage.setFrom("1847003070@qq.com");
javaMailSender.send(simpleMailMessage);
}
@Test
public void test2() throws MessagingException {
//复杂邮件测试
MimeMessage mimeMessage = javaMailSender.createMimeMessage();
MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMessage, true);
mimeMessageHelper.setSubject("通知");
mimeMessageHelper.setText("<b>今天放假啦</b>",true);
mimeMessageHelper.setFrom("1847003070@qq.com");
mimeMessageHelper.setFrom("760423314@qq.com");
//上传文件
mimeMessageHelper.addAttachment("1.jpg",new File("C:\\Users\\Public\\Pictures\\Sample Pictures"));
}
quertz
方式1
pom
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-quartz</artifactId>
</dependency>
配置
@Configuration
public class SchedulerQuartz {
@Autowired
private SchedulerFactoryBean schedulerFactoryBean;
private void scheduleJob1(Scheduler scheduler) throws SchedulerException {
//创建jobDetail
JobDetail jobDetail = JobBuilder.newJob(ScheduledJob.class) .withIdentity("job1", "group1").build();
// scheduleBuilder
CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule("0/1 * * * * ?");
//创建Trigger
CronTrigger cronTrigger = TriggerBuilder.newTrigger().withIdentity("trigger1", "group1")
.usingJobData("name","王智1").withSchedule(scheduleBuilder).build();
scheduler.scheduleJob(jobDetail,cronTrigger);
}
private void scheduleJob2(Scheduler scheduler) throws SchedulerException{
JobDetail jobDetail = JobBuilder.newJob(ScheduledJob2.class) .withIdentity("job2", "group2").build();
// 12秒的倍数执行 12 24 36 48 60
CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule("0/2 * * * * ?");
CronTrigger cronTrigger = TriggerBuilder.newTrigger().withIdentity("trigger2", "group2")
.usingJobData("name","王智2").withSchedule(scheduleBuilder).build();
scheduler.scheduleJob(jobDetail,cronTrigger);
}
/**
* @Description 定时任务
**/
@Bean
public Scheduler scheduleJobs() throws SchedulerException {
Scheduler scheduler = schedulerFactoryBean.getScheduler();
scheduleJob1(scheduler);
scheduleJob2(scheduler);
return scheduler;
}
}
//--------------------------------------------------
public class ScheduledJob2 implements Job {
private String name;
public void setName(String name) {
this.name = name;
}
@Override
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");
System.out.println("CRON ----> schedule job2 is running ... + " + name + " ----> " + dateFormat.format(new Date()));
}
}
方式2

浙公网安备 33010602011771号