Spring Scheduled 定时任务 + 异步执行


Spring定时任务 + 异步执行

1.实现spring定时任务的执行

import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import java.text.SimpleDateFormat;
import java.util.Date;

@Component
public class ScheduledTasks {
    private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd  HH:mm:ss");

    @Scheduled(fixedDelay = 5000)
    public void first() throws InterruptedException {
        System.out.println("第一个定时任务开始 : " + sdf.format(new Date()) + "\r\n线程 : " + Thread.currentThread().getName());
        System.out.println();
        Thread.sleep(1000 * 10); //模拟第一个任务执行的时间
    }

    @Scheduled(fixedDelay =3000)
    public void second() {
        System.out.println("第二个定时任务开始 : " + sdf.format(new Date()) + "\r\n线程 : " + Thread.currentThread().getName());
        System.out.println();
    }
}

由于执行定时任务默认的是单线程,存在的问题是:

​ 线程资源被第一个定时任务占用,第二个定时任务并不是3秒执行一次;

解决方法,创建定时任务的线程调度器,交给spring管理调度

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.TaskScheduler;
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;

@Configuration
public class ScheduleConfig {

    @Bean
    public TaskScheduler taskScheduler() {
        ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
        scheduler.setPoolSize(10);
        return scheduler;
    }
}

这样就可以保证定时任务之间是多线程,而每个定时任务之间是单线程,保证了定时任务的异步,同时保证了消息的幂等性


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM