У меня есть проект Angular, который вызывает REST API в Spring. В Angular я использую класс Observable для получения объекта Subscribe при запросе API:
this.currentSubs =
this.entity0.post(arg0, arg1, arg2)
.subscribe((res: any) => {
//logic here
}, (err: HttpErrorResponse) => {
//Error logic here
});
Мой API возвращает ответ от 40 до 2 минут, и у меня нет доступа для изменения сложности или количества времени, необходимого для выполнения этого запроса. Я реализовал кнопку отмены, которая вызывает это в Angular:
this.currentSubs.unsubscribe();
И когда я отменяю использование этого кода, я получаю это исключение на сервере:
java.io.IOException: An established connection was aborted by the software in your host machine.
Поскольку я использую Spring @RestController, @Repository и StoredProcedure, я хотел бы, чтобы я мог убедиться, что закрываю все сеансы, связанные с этим запросом REST. Поскольку я использую Oracle, я мог бы использовать
SELECT username FROM v$session
WHERE username IS NOT NULL
ORDER BY username ASC;
Но поскольку это приложение с общей базой данных, я не единственный, кто его использует. Когда я запускаю процедуру, я знаю, что если сессия будет остановлена наполовину, все незафиксированные данные будут отменены. Меня беспокоит количество открытых сессий / соединений с Oracle.




Возникает вопрос: что происходит с сервером, когда клиент умирает !? Соединение с Oracle остается активным.
Oracle имеет процесс проверки, настроенный с помощью SQLNET.EXPIRE_TIME (в минутах). Установка значения больше 0 (по умолчанию) гарантирует, что соединения не будут оставаться открытыми на неопределенный срок из-за ненормального завершения работы клиента.
Возможно, это могло бы пролить свет на вопрос: https://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:2233109200346833212.
Является ли IOException предупреждением в вашем журнале? Если нет, возможно, вам нужно перехватить это исключение и зарегистрировать некоторую информацию об отключении клиента !?
Я не уверен, но, возможно, @ControllerAdvice может помочь.
IOException перехватывается / распечатывается классом HTTP Spring. Я обнаружил, что Spring не создает новых подключений и продолжает использовать тот же сеанс. Поскольку обработчик ошибок встроен в классы Spring, я думаю, что ваше решение здесь не нужно, но оно крайне необходимо там, где не используется расширенная структура, такая как Spring.