[英]Java Spring boot async method isn't being called occasionally
我有一个使用@Async
注释的方法的服务,如下所示:
@Service("AsyncService")
public class AsyncService {
@Async
public void asyncPrint() {
logger.info("Inside asyncPrint");
}
}
异步方法是从另一个服务调用的,如下所示:
@Service("CallerService")
public class CallerService {
@Autowired
private AsyncService asyncService;
public void caller() {
logger.info("Before asyncPrint");
asyncService.asyncPrint();
logger.info("After asyncPrint");
// Custom code
}
}
但是,我发现有时没有调用异步方法。 我可以看到前后日志,但没有打印异步日志。
样品o/p:
//Logs from other services
Before asyncPrint
After asyncPrint
Inside asyncPrint
//Logs from other services
Before asyncPrint
After asyncPrint
为什么会发生这种情况? 如果 Executor 中存在积压,是否可以删除异步任务? 另外,有没有办法让我看到异步使用了多少正在运行的线程? 或者我还能如何调试?
谢谢。
日志并不意味着你的 Async 方法没有被调用,它意味着 Executor 还没有调用它。 默认情况下,@Async 使用ThreadPoolTaskExecutor
具有无限队列容量。 这意味着您的所有任务都将排队,直到处理线程可用。
如果你想增加你的处理线程,你可以定义一个自定义的ThreadPoolTaskExecutor
bean,如下所示。
@Bean
public Executor taskExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(2);
executor.setMaxPoolSize(2);
executor.setThreadNamePrefix("GithubLookup-");
executor.initialize();
return executor;
}
您可以根据您的硬件规格使用 corePoolSize 和 maxPoolSize 的地方。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.