Запрос не обработан асинхронно - PullRequest
0 голосов
/ 01 октября 2019

У меня есть служба, помеченная @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

1 Ответ

0 голосов
/ 11 октября 2019

Просто отправьте ответ @ M.Deinum, чтобы пометить его как правильный ответ, потому что он мне очень помог.

Тогда у вас есть 2 экземпляра службы, один из которых был проксирован для асинхронной синхронизации. другой нет. Возможно, у вас ContextLoaderListener загружаются те же компоненты, что и DispatcherServlet, эффективно дублирующие экземпляры компонентов

Проблема заключалась в том, что я использовал компонентное сканирование для того же пакета в spring-mvc-servlet. xml и applicationContext.xml

...