У меня есть Spring MVC Service с SSE API, имеющим контроллер возвратный тип ответа .
и в фоновом потоке асинхронизации, мы отправляем непрерывные сообщения данных клиенту над Sseemitter < /p>
@controler Method < /p>
@PostMapping(value = "/sse", consumes = { "application/json"},produces = {"text/event-stream"})
public ResponseEntity executeSseStreaming(
HttpServletRequest request, final @Valid @RequestBody ApiRequestDto apiRequestDto) throws JsonProcessingException {
String commandWithArgs = apiRequestDto.getCommand();
return new ResponseEntity(Service.executeServiceStreaming(commandWithArgs),
HttpStatus.OK);
}
< /code>
@service method < /p>
@Override
public SseEmitter executeServiceStreaming(String command) {
SseEmitter sseEmitter = new SseEmitter(15 * 60 * 1000L);
commandInvoker.invokeAsyncMethodStreaming(command, sseEmitter);// background async task
return sseContext.getSseEmitter();
}
< /code>
@component method < /p>
@Async("cmdAsyncCall")
public void invokeAsyncMethodStreaming(String cliBuff, SseEmitter sseEmitter) {
sock = connectionManagerFactory.getCommandExecConnection(cliBuff);
try (BufferedReader reader = new BufferedReader(new InputStreamReader(sock.getInputStream()))) {
String line;
while ((line = reader.readLine()) != null) {
sseEmitter().send(line);
}
sseContext.getSseEmitter().complete();
} catch (Exception e) {
sseContext.getSseEmitter().completeWithError(e);
throw new CustomException(ErrorConstants.EC_SOCKET_READ_FAILED, e);
}
}
< /code>
async config bean < /p>
@Configuration
@EnableAsync(proxyTargetClass = true)
public class CustomeAsyncCallConfig {
@Bean(name = "cmdAsyncCall")
public Executor asyncExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(5);
executor.setMaxPoolSize(10);
executor.setQueueCapacity(100);
executor.setThreadNamePrefix("SSE Thread: AsyncCall -");
executor.initialize();
return executor;
}
}
< /code>
После того, как все данные были отправлены, Async Thread вызывает sseemmiter.complete () и что тригеры ниже ошибки в catalina.log < /p>
12-Dec-2024 14:16:03.364 SEVERE [catalina-exec-7] org.apache.catalina.connector.CoyoteAdapter.asyncDispatch Exception while processing an asynchronous request java.lang.IllegalStateException: Cannot call sendError() after the response has been committed at org.apache.catalina.connector.Response.sendError(Response.java:1110) at org.apache.catalina.connector.Response.sendError(Response.java:1092) at org.apache.catalina.valves.RequestFilterValve.denyRequest(RequestFilterValve.java:394) at org.apache.catalina.valves.RequestFilterValve.process(RequestFilterValve.java:364) at org.apache.catalina.valves.RemoteAddrValve.invoke(RemoteAddrValve.java:54) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) at org.apache.catalina.connector.CoyoteAdapter.asyncDispatch(CoyoteAdapter.java:239) at org.apache.coyote.AbstractProcessor.dispatch(AbstractProcessor.java:243) at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:57) at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:905) at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1741) at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52) at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1190) at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63) at java.base/java.lang.Thread.run(Unknown Source)< /code> < /p>
Пробовал ниже вещи для этого выпуска < /p>
Возвращение объекта Sseemmiter непосредственно из метода API контроллера, < /p>
< /li>
Использование службы Custom Executior для Async Processing Work и Removing @Async, но также. Клиент, способный получить все данные, соединение также закрывается на стороне клиента после получения всех данных в почте. Но на сервере эта ошибка происходит в самом конце в обоих. Я могу получить все данные на стороне клиента с подключением в конце. Но на стороне сервера это конкретное исключение в журналах Catalina. Имя потока в Stacktrace обозначает его отличное от Async ThreadName, и может быть запускается сама пружина. Любая помощь будет высоко оценена. Заранее спасибо.
Подробнее здесь: https://stackoverflow.com/questions/792 ... -call-send
SSE Async API в Spring MVC выбрасывает ошибку OldalStateException: не может вызвать senderror () после совершения ответа ⇐ JAVA
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение