Java Spring boot asyn c метод вызывается не случайно - PullRequest
0 голосов
/ 31 января 2020

У меня есть служба с методом, помеченным @Async, как показано ниже:

@Service("AsyncService")
public class AsyncService {
   @Async
   public void asyncPrint() {
       logger.info("Inside asyncPrint");
   }
}

Метод asyn c вызывается из другой службы, подобной этой:

@Service("CallerService")
public class CallerService {
   @Autowired
   private AsyncService asyncService;

   public void caller() {
      logger.info("Before asyncPrint");
      asyncService.asyncPrint();
      logger.info("After asyncPrint");
      // Custom code
  }
}

Однако я вижу, что иногда метод asyn c не вызывается. Я вижу журналы «до» и «после», но журнал asyn c не печатается.

Пример o / p:

//Logs from other services
Before asyncPrint
After asyncPrint
Inside asyncPrint
//Logs from other services
Before asyncPrint
After asyncPrint

Почему это может происходить? Можно ли отбросить задачи asyn c, если в Executor есть отставание? Кроме того, есть ли способ узнать, сколько из всех запущенных потоков используется asyn c? Или как еще можно отладить это?

Спасибо.

1 Ответ

0 голосов
/ 31 января 2020

Журнал не означает, что ваш метод Asyn c не вызывается, это означает, что Исполнитель еще не вызвал его. @ Asyn c по умолчанию использует ThreadPoolTaskExecutor с неограниченной емкостью очереди. Это означает, что ВСЕ ваши задачи будут поставлены в очередь до тех пор, пока не станут доступны потоки обработки.

Если вы хотите увеличить потоки обработки, вы можете определить пользовательский компонент ThreadPoolTaskExecutor, как показано ниже.

  @Bean
  public Executor taskExecutor() {
    ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
    executor.setCorePoolSize(2);
    executor.setMaxPoolSize(2);
    executor.setThreadNamePrefix("GithubLookup-");
    executor.initialize();
    return executor;
  }

Где вы можете играть с corePoolSize и maxPoolSize в соответствии с вашими аппаратными спецификациями.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...