@RestController с StreamingResponseBody async.request-timeout не работает - PullRequest
0 голосов
/ 23 октября 2018

Я пытаюсь получить StreamingResponseBody от @RestController для длительной работы.Время ожидания истекает через 30 секунд, независимо от того, какую конфигурацию я пробую.

Это в Spring Boot 2.0.3.Я использовал приведенный ниже тест, который показывает то же поведение, чтобы попытаться получить правильную конфигурацию.

@RestController
public class TestController {

    @RequestMapping("/streamtest")
    public StreamingResponseBody handleRequest () {
        return new StreamingResponseBody() {
            @Override
            public void writeTo (OutputStream out) throws IOException {
                for (int i = 0; i < 100000; i++) {
                    out.write((Integer.toString(i) + " - ").getBytes());
                    out.flush();
                    try {
                        Thread.sleep(500);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
       };
   }
}

Я попробовал настройку async.request-timeout, определенную здесь; Асинхронное время ожидания загрузки большого файла с использованием StreamingResponseBody при загрузке Spring

Я попытался переопределить WebMvcConfig, чтобы установить время ожидания.Этот метод никогда не вызывается.

@EnableWebMvc
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {

    @Override
    public void configureAsyncSupport(AsyncSupportConfigurer configurer) {
        configurer.setDefaultTimeout(3600000);
        WebMvcConfigurer.super.configureAsyncSupport(configurer);
    }
}

Я пытался определить ThreadPoolTaskExecutor:

@Configuration
@EnableAsync
@EnableScheduling
public class AsyncConfig implements AsyncConfigurer {

    @Override
    public Executor getAsyncExecutor() {
        return new ThreadPoolTaskExecutor();
    }
}

Время ожидания всегда составляет 30 секунд с журналом;

12:14:28.028 [http-nio-8080-exec-2] DEBUG c.b.b.bof_static.config.BofStaticExceptionHandler - Async timeout for GET [/streamtest]
12:14:28.028 [http-nio-8080-exec-2] DEBUG org.springframework.web.servlet.DispatcherServlet - Null ModelAndView returned to DispatcherServlet with name 'dispatcherServlet': assuming HandlerAdapter completed request handling
12:14:28.028 [http-nio-8080-exec-2] DEBUG org.springframework.web.servlet.DispatcherServlet - Successfully completed request
12:14:28.030 [http-nio-8080-exec-2] DEBUG o.s.security.web.access.ExceptionTranslationFilter - Chain processed normally

Я не могу найти другие решения.Кто-нибудь может указать, чего не хватает?

Ответы [ 2 ]

0 голосов
/ 27 августа 2019

Установка следующей опции в application.properties может решить эту проблему:

spring.mvc.async.request-timeout=-1

Однако, если вы внедрите WebMvcConfigurer где-нибудь в вашем коде, то вышеуказанная опция будет проигнорирована, поэтому вы должны установить его следующим образом:

@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
    // other config...
    @Override
    public void configureAsyncSupport(AsyncSupportConfigurer configurer) {
        configurer.setDefaultTimeout(-1);
    }
}

Вы также можете установить его в положительное целое число (миллисекунды).Значение -1 полностью удалит время ожидания.

0 голосов
/ 24 октября 2018

У меня уже был настроен проект Spring Boot на моей машине с классом конфигурации, как показано ниже,

@Configuration
@EnableWebMvc
@EnableTransactionManagement
public class MyConfiguration extends WebMvcConfigurerAdapter {
  ...
  ...
}

Я просто добавил @EnableAsync к нему и ниже переопределенный метод,

    @Configuration
    @EnableWebMvc
    @EnableTransactionManagement
    @EnableAsync
    public class MyConfiguration extends WebMvcConfigurerAdapter {
      ...
      ...
    @Override
    public void configureAsyncSupport(AsyncSupportConfigurer configurer) {
      configurer.setDefaultTimeout(3600000);
    }
   }

Я просто отнес ваш метод к одному из моих классов контроллеров и нажал на него от чванства.Я не вижу проблемы в течение нескольких минут.Когда я добавляю ваш метод без вышеуказанных изменений в конфигурацию, я получаю

2018-10-24 11:35:55.085 ERROR 78852 --- [nio-8080-exec-6] c.h.a.a.aop.MyExceptionHandler       : Async timeout for GET [/test/common/streamtest]

, так что, кажется, все работает нормально для меня.

Мое единственное предположение из вашего кода состоит в том, что вы, возможно, поставили @EnableAsync в неправильном месте.

Кроме того, держите вещи минимальными и не экспериментируйте с ThreadPoolTaskExecutor() сейчас, и пусть ваш запрос будет выполнен по умолчанию - SimpleAsyncTaskExecutor.Как только ваш Async работает с пользовательским таймаутом, вы можете подключить его позже.

Я запускаю приложение во встроенном коте.

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