У меня есть служба, помеченная @Async
. Он правильно обрабатывается в threadExecutor при вызове из другой службы, но не при вызове из контроллера с запросом сопоставления
@Service
public class StartupService implements ApplicationListener<ContextRefreshedEvent> {
private static Logger LOGGER = LoggerFactory.getLogger(StartupService.class);
@Autowired
StockService stockService;
@Override
public void onApplicationEvent(final ContextRefreshedEvent event) {
if(event.getApplicationContext().getParent() == null) {
LOGGER.debug("stockService.load call begin " + Thread.currentThread().getName());
stockService.reload();
LOGGER.debug("stockService.load call end " + Thread.currentThread().getName());
}
}
}
@Controller
@RequestMapping(value = "/api")
public class ApiController {
private static Logger LOGGER = LoggerFactory.getLogger(ApiController.class);
@Autowired
StockService stockService;
@ResponseStatus(value = HttpStatus.OK)
@RequestMapping(value = "/reload.do", method = RequestMethod.GET)
public void reloadStock() {
LOGGER.debug("stockService.load call begin " + Thread.currentThread().getName());
stockService.reload();
LOGGER.debug("stockService.load call end " + Thread.currentThread().getName());
}
}
@Service
public class StockService {
private static Logger LOGGER = LoggerFactory.getLogger(StockService.class);
@Async
public void reload() {
LOGGER.debug("stockService.load run begin " + Thread.currentThread().getName());
//do the magic stuff
LOGGER.debug("stockService.load run end " + Thread.currentThread().getName());
}
}
Вывод следующий. При вызове из StartupService метод в StockService вызывается в настроенном исполнителе. При вызове из ApiController метод в StockService вызывается в том же потоке
DEBUG [StartupService]: stockService.load call begin http-apr-8080-exec-70
DEBUG [StartupService]: stockService.load call end http-apr-8080-exec-70
DEBUG [StockService]: stockService.load run begin stockexecutor-1
DEBUG [StockService]: stockService.load run end stockexecutor-1
DEBUG [ApiController]: stockService.load call begin http-apr-8080-exec-85
DEBUG [StockService]: stockService.load run begin http-apr-8080-exec-85
DEBUG [StockService]: stockService.load run end http-apr-8080-exec-85
DEBUG [ApiController]: stockService.load call end http-apr-8080-exec-85