繁体   English   中英

偶尔不会调用 Java Spring 启动异步方法

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM