Почему моя лямбда-функция вызывает утечку ресурсов в Java (с использованием Quarkus)?JAVA

Программисты JAVA общаются здесь
Anonymous
Почему моя лямбда-функция вызывает утечку ресурсов в Java (с использованием Quarkus)?

Сообщение Anonymous »

У меня есть микросервис Quarkus (назовем его A), который отправляет POST-запрос другому микросервису (назовем его B) с помощью RestClient. Если A отправляет запрос B, но B не работает (то есть еще не запущен), то Quarkus автоматически останавливает микросервис A из-за необработанного исключения, что является нормальным поведением. Чтобы исправить это без необходимости заключать каждый вызов в блок try-catch, я попробовал следующее:
Я пробовал использовать @ClientExceptionMapper, но для этого исключения это не сработало. Насколько я понимаю, этот ClientExceptionMapper обрабатывает RuntimeExceptions, а исключение, с которым я сталкиваюсь, - это ProcessException, как видно в выводе отладчика:

Код: Выделить всё

2024-04-19 11:49:21,649 ERROR [io.qua.run.Application] (Quarkus Main Thread) Failed to start application (with profile [dev]): jakarta.ws.rs.ProcessingException: io.netty.channel.AbstractChannel$AnnotatedConnectException: Connection refused: no further information: localhost/127.0.0.1:8081
Чтобы обработать это исключение без необходимости писать блок try-catch вокруг каждого HTTP-запроса в моем микросервисе (что, честно говоря, случается нечасто, но я хочу узнать что-то новое) ), я решил обернуть вызов функции в служебный метод, используя лямбда-выражения.
Итак, вместо: testClient.makePost(someDataClass);
он ​​становится: ClientUtilities.handleConnectionRefused(() -> testClient.makePost(someDataClass));
Где ClientUtilities определяется следующим образом:

Код: Выделить всё

package org.acme.rest.client;

import java.net.ConnectException;
import java.util.function.Supplier;
import jakarta.ws.rs.ProcessingException;
import jakarta.ws.rs.core.Response;

public class ClientUtilities {
public static Response handleConnectionRefused(Supplier restClientCall) {
Response response = null;
try {
response = restClientCall.get();
} catch (ProcessingException e) {
if (e.getCause() instanceof ConnectException) {
// Handle connection refused error
System.out.println("Connection refused: " + e.getMessage());
return Response.status(Response.Status.NOT_FOUND).build();
} else {
// Handle other errors
throw e;
}
} finally {
if (response != null) {
response.close();
}
}
return Response.status(Response.Status.OK).build();
}
}
Это исправляет завершение работы приложения, поскольку теперь исключение обрабатывается. Но внутри моей IDE (то есть VS Code) генерируется предупреждение.
Предупреждение — утечка ресурсов: '' никогда не закрывается заданный в этой строке ClientUtilities.handleConnectionRefused(() -> testClient.makePost(someDataClass));. В частности, часть testClient.makePost(someDataClass)
Поскольку я все еще новичок в Java (студент компьютерных наук) и хочу изучать и исследовать концепции программирования, вероятность того, что я допустил ошибку, высока. Я пытался провести небольшое исследование на эту тему, но не стал мудрее.
Я загрузил на Github пример проекта, который демонстрирует эту проблему.Я хочу знать, почему возникает это предупреждение и, если возможно, как правильно реализовать мое решение, чтобы оно не выдавало предупреждение и, таким образом, становилось менее подверженным утечке ресурсов.

Подробнее здесь: https://stackoverflow.com/questions/783 ... ng-quarkus

Вернуться в «JAVA»