@scheduled定时器多个任务

@scheduled是单线程,同一时间有多个定时任务,且数据量比较大则会阻塞其他定时任务。
修改方法:配置线程池——
方法一.使用异步
1.添加全局@EnableAsync 注解,开启对异步的支持

@Component
@EnableScheduling
@EnableAsync
public class ScheduleTask {

}

2.方法中添加@Async,将定时任务设置成异步执行(该异步执行器每次都会开启一个子线程执行,性能消耗比较大,所以最好是自己配置线程池,如第3步创建指定线程池,或者第4步定义全局线程池)

@Scheduled(fixedDelay =60 * 1000)
@Async
public void hello() {
    System.out.println("Hello"+new Date());
}

3.可使用@Async(“executor1”) ,配置线程池 public Executor executor1() {},指定使用“executor1”

@Scheduled(fixedDelay =60 * 1000)
@Async("executor1")
public void hello() {
    System.out.println("Hello"+new Date());
}

4.可定义全局线程池,实现 AsyncConfigurer 或者继承 AsyncConfigurerSupport

@Configuration
@EnableAsync
public class ThreadPoolTaskExecutorConfig {

    @Bean
    public Executor executor1() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setThreadNamePrefix("test-schedule1-");
        executor.setMaxPoolSize(20);
        executor.setCorePoolSize(15);
        executor.setQueueCapacity(0);
        executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
        return executor;
    }

}

PS:没有配置线程池时,会默认使SimpleAsyncTaskExecutor。

方法二. 将Scheduled配置成成多线程执行
第一种:通过实现SchedulingConfigurer接口的方式

@Configuration
public class ScheduleThreadPoolConfig implements SchedulingConfigurer {
 
    @Resource
    private TaskSchedulerBuilder builder;
 
    @Override
    public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
        ThreadPoolTaskScheduler taskScheduler = builder.build();
        taskScheduler.initialize();
        taskRegistrar.setScheduler(taskScheduler);
    }
 
}

第二种:手动注册 ThreadPoolTaskScheduler 和 ThreadPoolTaskExecutor 进入spring 容器

@Configuration
public class InitThreadPoolTaskScheduler {
 
    @Bean(name = {"ThreadPoolTaskScheduler"})
    public ThreadPoolTaskScheduler ThreadPoolTaskScheduler(TaskSchedulerBuilder builder){
        ThreadPoolTaskScheduler taskScheduler = builder.build();
//        taskScheduler.initialize();
        return taskScheduler;
    }
 
    @Lazy
    @Bean(
            name = {"applicationTaskExecutor", "taskExecutor"}
    )
    public ThreadPoolTaskExecutor applicationTaskExecutor(TaskExecutorBuilder builder) {
        return builder.build();
    }
}

参考博客:https://blog.csdn.net/bug_chen_xue/article/details/109532155

https://blog.csdn.net/to_study/article/details/110228431

@Scheduled注解是Spring框架提供的一种方式,用于实现定时任务的调度。它可以配合分布式任务调度框架来实现分布式定时器的功能。 要实现分布式定时器,可以使用以下步骤: 1. 首先,需要引入Spring框架和相关的依赖。可以在项目的pom.xml文件中添加spring-boot-starter和spring-boot-starter-web依赖。 ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> ``` 2. 创建一个定时任务类,使用@Scheduled注解标记需要定时执行的方法。该方法会根据注解中的cron表达式或固定的时间间隔来触发执行。 ```java @Component public class MyScheduler { @Scheduled(cron = "0 0 12 * * ?") // 每天中午12点触发执行 public void myTask() { // 定时任务逻辑 } } ``` 3. 在Spring Boot的启动类上添加@EnableScheduling注解,启用定时任务的调度功能。 ```java @SpringBootApplication @EnableScheduling public class MyApplication { public static void main(String[] args) { SpringApplication.run(MyApplication.class, args); } } ``` 4. 配置分布式任务调度框架,例如Quartz或Elastic-Job,来实现分布式定时任务的调度和执行。具体的配置方式和使用方法可以参考对应框架的文档。 通过以上步骤,就可以使用@Scheduled注解实现分布式定时器的功能了。定时任务会在指定的时间触发执行,无论是单节点还是多节点部署,都能够按照设定的规则进行执行。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值