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

 

posted @ 2019-08-20 22:25  小名的同学  阅读(253)  评论(0编辑  收藏  举报