有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何强制Spring调度运行并行执行单个方法?

我正在尝试使用@Scheduled方法(每秒)处理一些常规工作。这个方法的主体可以在超过一秒钟的时间内处理,我发现如果发生这种情况,下一次执行就不会开始。Spring是否支持它,或者我应该将其更改为任何其他并发解决方案

我已经尝试将Scheduler更改为ConcurrentTaskScheduler,但看起来只有当我们只有很少的schedules方法时,它才有帮助

@Service
public class MainService {
    @Scheduled(cron = "* * * * * *")
    public void doSomething() {
       //some logic which can takes more than 1 second   
    }
}

@Configuration
public class SchedulingConfig implements SchedulingConfigurer {

    @Override
    public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
        taskRegistrar.setScheduler(taskExecutor());
    }

    @Bean
    public Executor taskExecutor() {
        return new ConcurrentTaskScheduler(
                Executors.newScheduledThreadPool(100));
    }
}

一旦第一次执行需要额外的时间,第二次执行将不会开始。否则,一切正常。如何设置一个计划方法的并行执行


共 (1) 个答案

  1. # 1 楼答案

    可以引入一个异步组件,这样就不需要1秒https://www.baeldung.com/spring-async

    @Service
    public class MainService {
    
    @Autowired
    private SomethingService somethingService;
    
        @Scheduled(cron = "* * * * * *")
        public void doSomething() {
           somethingService.doSomething();   
        }
    }
    
    //Introduce an async component so it does not take 1 second. runs doSomething() in a separate thread
    
    @Component
    public class SomethingService {
    
        @Async
        public void doSomething() {
           //some logic which can takes more than 1 second   
        }
    }