Async support must be enabled on a servlet and for all filters involved in async request processing

Здравствуйте!

У меня есть на форме Label со значением внутри
< audio controls="" style=“height:30px” src=“http://localhost:8074/cc/rest/audio/v1/audio?uniqueId=1627905210.129&atsCode=FF_MedAss_TEST”>Your browser does not support the audio element.< /audio >

Есть TalkRecordProvideRestController и метод downloadAudio (TalkRecordProvideRestController.java (6.1 КБ))

Так вот визуальный компонент обращается к REST методу тело которого отрабатывает нормально
но дальше возникает ошибка в результате чего компонент серый (неактивна кнопка play и длительность 0 показывает)

Через Postman же видна ошибка
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.
(ответ целиком in-s-77057835059-20210827-074030-1630050030.257.txt (11.5 КБ))

в catalina.out один раз выводится такое

14:51:18.799 WARN o.s.w.c.r.async.WebAsyncManager -
!!!
An Executor is required to handle java.util.concurrent.Callable return values.
Please, configure a TaskExecutor in the MVC config under “async support”.
The SimpleAsyncTaskExecutor currently in use is not suitable under load.

Request URI: ‘/cc/rest/audio/v1/audio’
!!!

Мой web.xml web.xml (2.2 КБ)

Мой rest-dispatcher-spring.xml rest-dispatcher-spring.xml (1.5 КБ)

Версия платформы ext.cubaVersion = ‘7.1.8’

Что можно сделать?
Слепое добавление < async-supported >true< /async-supported > везде где можно в web.xml ничего не дало

Добрый день,
В сообщении написано, что нужно определить taskExecutor в конфигурации Spring.

Вот здесь есть пример xml-конфигурации:

<mvc:annotation-driven>
    <mvc:async-support default-timeout="30000"  task-executor="taskExecutor">
    </mvc:async-support>
</mvc:annotation-driven>
<bean id="taskExecutor"
        class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
    <property name="corePoolSize" value="5" />
    <property name="maxPoolSize" value="50" />
    <property name="queueCapacity" value="10" />
    <property name="keepAliveSeconds" value="120" />
</bean>

Также следует добавить async-support=true к CubaDispatcherServlet в web.xml.

добавил. к сожалению не помогло (
spring.xml (385 Байт)
web-spring.xml (2.7 КБ)
web_core.xml (1.4 КБ)
web.xml (2.2 КБ)

Думаю, что taskExecutor нужно добавлять в dispatcher-spring.xml того модуля, где расположен контроллер.

Добавил. Проблема не решилась.
плеер всё равно “серый”. И в Postman та же ошибка.

Правда в catalina.out исчез WARN o.s.w.c.r.async.WebAsyncManager
но тем не менее.
rest-dispatcher-spring.xml (2.1 КБ)
web-dispatcher-spring.xml (1.1 КБ)
web-spring.xml (2.2 КБ)

Александр, здравствуйте!
Скажите, пожалуйста, есть ли новые идеи для решения проблемы?

Я попробовал сделать маленький проект с контроллером как у вас, и у меня заработало.
Аннотация @Async на методе не нужна.

проект:

image

У вас контроллер находится внутри “/rest”, может там еще какой-то фильтр неявно добавляется в цепочку. Попробуйте сменить путь.

Александр, спасибо большое за помощь!

Заработало )
Правда я сделал чуть по другому.

Заменил аннотации на контроллере на

@Controller
public class TalkAudioRecordProvideController {

на методе на

    @RequestMapping(value = "audio", method = RequestMethod.GET)
    @ResponseBody

в заголовке ответа (в методе) на

 .header("Content-Type", "audio/wav")

хотя может это и не влияет (не проверял)

в URL вызова на

AppContext.getProperty("cuba.webAppUrl") + "/dispatch/audio?...

в web-dispatcher-spring.xml добавил

    <context:component-scan base-package="kz.uco.callcenter.web.controllers"/>

ну и строка async-supported в web.xml нужна (без неё не работает)

    <servlet>
        <servlet-name>dispatcher</servlet-name>
        <servlet-class>com.haulmont.cuba.web.sys.CubaDispatcherServlet</servlet-class>
        <async-supported>true</async-supported>
        <load-on-startup>1</load-on-startup>
    </servlet>

без taskExecutor вроде работает но WARN в catalina.out выходит. посмотрим на продуктиве как будет работать

В любом случае, спасибо! :slight_smile:

Александр,
к сожалению на сервере не работает (хотя локально как я писал раньше - работает)

Используется вариант single war
в single-war-web.xml нет строчки

<servlet>
        <servlet-name>dispatcher</servlet-name>

соответственно туда не знаю где вставить

< async-supported >true< /async-supported>

а в web.xml она есть

но при разворачивании на сервере web.xml выглядит как single-war-web.xml

добавление <bean id=“taskExecutor” никак не повлияло на результат

single-war-web.xml (1.9 КБ)
web.xml (2.3 КБ)
web-dispatcher-spring.xml (1.1 КБ)
catalina.out.txt (53.8 КБ)

В single war сборке используется специальный код с объединением двух контекстов приложения в один. Неудивительно что не работает. Я не уверен, что удастся подлезть в код платформы для простановки флага asyncSupported.
Советую просто использовать развертывание раздельных WAR файлов.

Но на предыдущем (другом) проекте (с платформой 6.8) это работало на single war

Александр, здравствуйте!

В single war сборке используется специальный код с объединением двух контекстов приложения в один. Неудивительно что не работает.

Повторю, в предыдущем проекте на платформе 6.8 это работало на single war.
А также локально это тоже работает. Локально же у нас один томкат сервер.

Давайте пожалуйста как-то заставим это заработать )

Добрый день.

В локальном Томкате разворачиваются два приложения: web и core, для которых можно собрать отдельные war файлы.

Не могли бы Вы приложить демо проект для которого single war сборка не препятствует работе аудио файла?

Глеб