После поиска многих статей я не смог найти причину закрытия HttpServletResponse. Я использую Apache Tailer для чтения файла журнала и отправки этих строк в виде потока в мой API для отдыха. Ниже приведены некоторые подробности моей реализации.
Rest API:
@GetMapping(value = "/tag/{id}/logevents", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
public void getTagLogEvents(@PathVariable("id") String id, HttpServletResponse response) throws ApiException {
response.setContentType(MediaType.TEXT_EVENT_STREAM_VALUE);
response.setHeader("Cache-Control", "no-cache");
response.setHeader("Connection", "keep-alive");
tagService.streamLiveLogFile(tagId+".log", response);
}
Настраиваемый класс прослушивателя журнала тестирования Publisher.java. Я хотел записать эти строки в ответ в виде потока.
public class TestingLogPublisher extends TailerListenerAdapter {
HttpServletResponse response;
public TestingLogPublisher(HttpServletResponse response) {
this.response = response;
}
@Override
public void handle(String line) {
if (StringUtils.isNotBlank(line)) {
try {
response.getOutputStream().println(line);
response.getOutputStream().flush();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
На моем уровне обслуживания я создаю Tailer, как показано ниже.
Tailer.builder()
.setFile(myPath.toFile())
.setTailerListener(new TestingLogPublisher(response))
.setDelayDuration(Duration.ofMillis(100L))
.get();
Я получаю следующую ошибку. Может ли кто-нибудь подсказать, как записать строки журнала в HttpServletResponse?
org.springframework.web.context.request.async.AsyncRequestNotUsableException: ServletOutputStream failed to write: Closed
at org.springframework.web.context.request.async.StandardServletAsyncWebRequest$LifecycleHttpServletResponse.handleIOException(StandardServletAsyncWebRequest.java:320) ~[spring-web-6.1.8.jar!/:6.1.8]
at org.springframework.web.context.request.async.StandardServletAsyncWebRequest$LifecycleServletOutputStream.write(StandardServletAsyncWebRequest.java:378) ~[spring-web-6.1.8.jar!/:6.1.8]
at jakarta.servlet.ServletOutputStream.print(ServletOutputStream.java:86) ~[jakarta.servlet-api-6.0.0.jar!/:6.0.0]
at jakarta.servlet.ServletOutputStream.println(ServletOutputStream.java:188) ~[jakarta.servlet-api-6.0.0.jar!/:6.0.0]
Подробнее здесь: https://stackoverflow.com/questions/791 ... etresponse