如何使 Spring 引导 @Scheduled 线程超时
How to timeout a Spring Boot @Scheduled Thread
我有一个 Spring 引导应用程序,它在一天中的特定时间运行许多作业(由 CRON 配置)。
现在我发现应用程序是 运行 但计划的作业没有得到执行。
有什么方法可以为在 Spring.
中用 @Scheduled 注释的任务添加超时
这样即使作业被阻塞或等待,也可以将其杀死,让其他线程顺利执行。线程可以等待指定的时间,然后如果任务没有完成,则终止线程。
我知道我可以使用以下方法增加池大小:
Executors.newScheduledThreadPool();
但是如果最终所有线程都被阻塞会发生什么
我浏览了论坛,看到了提到使用 FutureTasks 的解决方案。这可以应用于带有@Scheduled 注释的任务吗?
由于应用程序是 spring-boot,所以没有 xml 配置来配置超时。
您可以使用TaskScheduler
来启动和控制任务。在你的 @Configuration
class 中:
@Configuration
public class YourConfig {
@Bean
public TaskScheduler scheduler() {
return new ThreadPoolTaskScheduler();
}
// ...
之后,您可以这样安排您的任务:
@Service
public class YourTaskRunnable implements Runnable {
@Autowired
private TaskScheduler scheduler;
@PostConstruct
private void init() {
ScheduledFuture future = this.scheduler.schedule(this, /* to execute immediately, for example */ Calendar.getInstance().getTime());
// ...
}
@Override
public void run() {
// Your task code ...
}
}
我有一个 Spring 引导应用程序,它在一天中的特定时间运行许多作业(由 CRON 配置)。 现在我发现应用程序是 运行 但计划的作业没有得到执行。 有什么方法可以为在 Spring.
中用 @Scheduled 注释的任务添加超时这样即使作业被阻塞或等待,也可以将其杀死,让其他线程顺利执行。线程可以等待指定的时间,然后如果任务没有完成,则终止线程。
我知道我可以使用以下方法增加池大小:
Executors.newScheduledThreadPool();
但是如果最终所有线程都被阻塞会发生什么
我浏览了论坛,看到了提到使用 FutureTasks 的解决方案。这可以应用于带有@Scheduled 注释的任务吗? 由于应用程序是 spring-boot,所以没有 xml 配置来配置超时。
您可以使用TaskScheduler
来启动和控制任务。在你的 @Configuration
class 中:
@Configuration
public class YourConfig {
@Bean
public TaskScheduler scheduler() {
return new ThreadPoolTaskScheduler();
}
// ...
之后,您可以这样安排您的任务:
@Service
public class YourTaskRunnable implements Runnable {
@Autowired
private TaskScheduler scheduler;
@PostConstruct
private void init() {
ScheduledFuture future = this.scheduler.schedule(this, /* to execute immediately, for example */ Calendar.getInstance().getTime());
// ...
}
@Override
public void run() {
// Your task code ...
}
}