Man*_*dan 4 spring spring-3 spring-scheduled
我有这门课
@Service
@Profile("async")
public class MyServiceImplAsync implements MyService {
..
@Async
@Override
public void printGreetings(String name) {
//do something and sleep 10 seconds
}
@Async
@Override
public Future<String> doSomething(String text) {
//do something and sleep 25 seconds
return new AsyncResult<String>(text);
}
}
Run Code Online (Sandbox Code Playgroud)
观察,两种方法使用 @Async
现在,我也有以下内容:
@Component
public class MySchedule {
..
@Scheduled(cron="*/5 * * * * ?")
public void schedule(){
logger.info("Schedule working at {}", simpleDateFormat.format( new Date() ));
this.myService.printGreetings("Manolito");
}
@Scheduled(cron="*/30 * * * * ?")
public void scheduleFuture(){
logger.info("Schedule Future working at {}", simpleDateFormat.format( new Date() ));
try {
logger.info("{}", this.myService.doSomething("manolito").get(26, TimeUnit.SECONDS));
}
catch (InterruptedException | ExecutionException | TimeoutException e) {
logger.error("Error: {}, Class: {}", e.getMessage(), e.getClass());
}
}
}
Run Code Online (Sandbox Code Playgroud)
该schedule()方法必须每5秒执行一次,并且该scheduleFuture()方法必须每30秒执行一次.
我对以下情况感到困惑:
我可以看到这个schedule()方法每5秒钟scheduleFuture()就能正常运行,然后当开始运行时,scheduleFuture()由于Future的get方法,该方法仍然被阻止.我对此很好,因为它是根据Future API的预期行为.
我想:
只
scheduleFuture()应该阻止该方法.
问题:我无法理解为什么scheduleFuture()还要阻止其他schedule()方法!我的意思是如果scheduleFuture()被封锁,schedule()遗体也被封锁了!它无法启动新的循环或执行.直到scheduleFuture()再次解锁.
为什么会这样?
我有两个 @Scheduled方法,每个方法调用两个用@Asyncbean 注释的不同方法(如果MyServiceImplAsync类是相同的情况)@Scope("prototype")
提前致谢.
因为您阻止了用于计划这些任务的单个线程.来自@EnableScheduling:
在上述所有方案中,都使用默认的单线程任务执行程序.当需要更多控制时,@ Configuration类可以实现SchedulingConfigurer.这允许访问底层的ScheduledTaskRegistrar实例.
@Configuration
@EnableScheduling
public class AppConfig implements SchedulingConfigurer {
@Override
public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
taskRegistrar.setScheduler(taskExecutor());
}
@Bean(destroyMethod="shutdown")
public Executor taskExecutor() {
return Executors.newScheduledThreadPool(100);
}
}
Run Code Online (Sandbox Code Playgroud)
当您遇到此类问题时,最好将配置日志框架以显示线程的名称.使用log4j,您需要添加%t到您的PatternLayout
| 归档时间: |
|
| 查看次数: |
1438 次 |
| 最近记录: |