Тайм-аут DeferredResult тайм-аут

У меня есть наблюдаемое и, как это может занять много времени, я возвращаю весну DeferredResult,

Это логика контроллера, которую я использую:

public DeferredResult<ResponseEntity<InputStreamResource>> getSomeFile() {
    DeferredResult<ResponseEntity<InputStreamResource>> deferredResult = new DeferredResult<>(TIMEOUT);
    Observable<File> observableFile = fileService.getSomeFile();
    observableFile
            .map(this::fileToInputStreamResource)
            .map(resource -> ResponseEntity.ok().cacheControl(CacheControl.maxAge(1, TimeUnit.HOURS).cachePublic()).body(resource))
            .subscribe(deferredResult::setResult, ex -> {
                deferredResult.setErrorResult(ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(null));
            });
    return deferredResult;
}

И это мой тестовый пример:

@Test
public void getSomeFile() throws Exception {
    this.mockMvc.perform(get("/somefile").accept(MediaType.parseMediaType("application/xml;charset=UTF-8")))
            .andExpect(request().asyncStarted())
            .andExpect(status().isOk())
            .andDo(result -> {
                ResponseEntity<InputStreamResource> fileResource = (ResponseEntity<InputStreamResource>) result.getAsyncResult();
                InputStream fileResourceInputStream = fileResource.getBody().getInputStream();
                FooBar foobar = (FooBar) jaxb2Marshaller.unmarshal(new StreamSource(fileResourceInputStream));
                assertThat(foobar.getFoos(), is(not(empty())));
            });
}

Этот тест не проходит, когда я создаю экземпляр DeferredResult без установленного времени ожидания, так как он использует общий тайм-аут, установленный для шаблона отдыха (10 секунд). Если я явно установить время ожидания new DefferredResult(Long.MAX_VALUE) это терпит неудачу с тем же исключением:

java.lang.IllegalStateException: Async result for handler [public org.springframework.web.context.request.async.DeferredResult<org.springframework.http.ResponseEntity<org.springframework.core.io.InputStreamResource>> com.example.controller.FileController.getSomeFile()] was not set during the specified timeToWait=9223372036854775807
    at org.springframework.test.web.servlet.DefaultMvcResult.getAsyncResult(DefaultMvcResult.java:145)
    at org.springframework.test.web.servlet.DefaultMvcResult.getAsyncResult(DefaultMvcResult.java:121)
    at org.springframework.test.web.servlet.result.RequestResultMatchers$4.match(RequestResultMatchers.java:114)
    at org.springframework.test.web.servlet.MockMvc$1.andExpect(MockMvc.java:171)

Так как тайм-аут должен быть настроен или в чем проблема?

0 ответов

Другие вопросы по тегам