Асинхронная поддержка контроллера Spring в Java

Когда я пытаюсь позвонить своему весеннему веб-клиенту, я получаю сообщение об ошибке:

HTTP Status 500 - Request processing failed; nested exception is java.lang.IllegalStateException: Async support must be enabled on a servlet and for all filters involved in async request processing. This is done in Java code using the Servlet API or by adding "true" to servlet and filter declarations in web.xml.

У меня нет доступа/вернее не возиться с файлом web.xml. Мой пружинный контроллер выглядит следующим образом:

@Controller
@RequestMapping("/test/test")
public class MyController
{
     //Using DeferedResult and Http get / post
}

Что я пробовал: ставить @Async выше класса и выше методов для получения/отправки. Также попытался поставить @EnableAsync выше класса. Как включить поддержку асинхронности в коде Java, не делая этого в web.xml? Не удалось найти много помощи в Интернете


person Rajesh K    schedule 01.07.2015    source источник
comment
Покажи свой web.xml файл   -  person Strelok    schedule 01.07.2015
comment
Как я уже сказал, у меня нет доступа к файлу web.xml. Мне нужно сделать это способом Java   -  person Rajesh K    schedule 01.07.2015
comment
Да, но ваш web.xml может быть неправильно настроен. Дело не только в том, чтобы сделать это способом Java.   -  person Strelok    schedule 01.07.2015
comment
Используете ли вы конфигурацию на основе Java для своего сервлета?   -  person Ian Dallas    schedule 01.07.2015


Ответы (1)


Если вы используете контекст приложения в стиле Java вместо xml, приведенная ниже конфигурация должна работать.

@Configuration
@EnableAutoConfiguration
@EnableAsync
@ComponentScan("your.package")
public class AppConfig extends SpringBootServletInitializer implements AsyncConfigurer {

    @Override
    public Executor getAsyncExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setCorePoolSize(20);
        executor.setMaxPoolSize(100);
        executor.setQueueCapacity(200);
        executor.initialize();
        return executor;
    }

    @Override
    public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
        return new MyAsyncExceptionHandler();
    }
}

Также вот пример для asyncExceptionHandler

public class MyAsyncExceptionHandler implements AsyncUncaughtExceptionHandler {

    static Logger log = Logger.getLogger(MyAsyncExceptionHandler.class.getName());

    @Override
    public void handleUncaughtException(Throwable throwable, Method method, Object... obj) {
        log.error("Exception message - " + throwable.getMessage());
        log.error("Method name - " + method.getName());
        for (Object param : obj) {
            log.error("Parameter value - " + param);
        }

    }

}
person Steve Park    schedule 01.07.2015