java - 如何强制 Spring Scheduled 并行执行单个方法?
问题描述
我正在尝试使用@Scheduled
方法来处理一些常规工作(每秒)。此方法的主体可以处理超过一秒钟,我看到如果发生这种情况,下一次执行不会开始。Spring 是否支持它,或者我应该将其更改为任何其他并发解决方案?
我曾尝试将 Scheduler 更改为ConcurrentTaskScheduler
,但看起来只有在我们的 scheduler 方法很少时才有帮助。
@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 秒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
}
}
推荐阅读
- php - 带有参数和类型的soap客户端调用函数
- android - 清单合并失败(使用房间)
- python - 如何计算每条记录中的单词并在最佳时间将其存储在单词和键级别?
- java - 示例 keycloak spring-boot 应用程序无法找到 bean KeycloakSpringBootConfigResolver
- r - 如何在 GGparcoord R 的平行坐标图中添加刻度?
- perl - 在 perl 中添加到哈希时遇到问题
- go - 使用 Go Olivere/elastic 过滤 value1 == value2 的 Elasticsearch 查询
- qt - QDateTime 自定义格式转义符号
- django - 运行“迁移”不会生成迁移文件夹
- java - 在 OpenAPI 中启用异步服务器 API,按需为 Jersey 生成代码