Эксепшен не перехватывается СircuitBreaker-ом
У меня есть два сервиса, и вот когда отправка запроса с одного на второй идет через FeignClient
package org.example.projectservice.client;
import org.example.projectservice.config.FeignClientConfiguration;
import org.example.projectservice.dto.response.CompanyResponse;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
@FeignClient(value = "${service.company.name}",
path = "${service.company.path}",
configuration = FeignClientConfiguration.class)
public interface CompanyFeignClient {
@GetMapping("/{companyId}")
CompanyResponse getCompanyById(@PathVariable String companyId);
}
Так же есть вот такой decoder
package org.example.projectservice.config;
import feign.FeignException;
import feign.Response;
import feign.RetryableException;
import feign.codec.ErrorDecoder;
import org.example.projectservice.exception.FeignClientException;
import org.example.projectservice.exception.NotFoundException;
public class MyDecoder implements ErrorDecoder {
@Override
public Exception decode(String s, Response response) {
FeignException exception = FeignException.errorStatus(s, response);
int status = response.status();
if (status == 503) {
return new RetryableException(
status,
"Service unavailable",
response.request().httpMethod(),
(Long) null,
response.request()
);
}
String[] responseMessageSplit = exception.getMessage().split("\"message\"");
String[] exMessageSplit = responseMessageSplit[responseMessageSplit.length - 1].split("\"");
System.out.println(exMessageSplit.toString());
String exMessage = exMessageSplit[exMessageSplit.length - 2];
if (status == 400) {
return new FeignClientException(exMessage);
}
if (status == 404) {
return new NotFoundException(exMessage);
}
return exception;
}
}
Так же есть вот такой сервис который вызывает этот метод
package org.example.projectservice.service.impl;
import feign.FeignException;
import feign.RetryableException;
import io.github.resilience4j.circuitbreaker.annotation.CircuitBreaker;
import lombok.RequiredArgsConstructor;
import org.example.projectservice.client.CompanyFeignClient;
import org.example.projectservice.dto.response.CompanyResponse;
import org.example.projectservice.exception.ServiceUnAvailableException;
import org.example.projectservice.service.CompanyService;
import org.example.projectservice.utill.ExceptionMessages;
import org.springframework.stereotype.Service;
@Service
@RequiredArgsConstructor
public class CompanyServiceImpl implements CompanyService {
private final CompanyFeignClient companyFeignClient;
@Override
@CircuitBreaker(name = "company", fallbackMethod = "fallBackMethodCompanyService")
public CompanyResponse getCompanyById(String companyId) {
return companyFeignClient.getCompanyById(companyId);
}
public CompanyResponse fallBackMethodCompanyService(String companyId, RetryableException e) {
System.out.println("From RetryableException");
throw new ServiceUnAvailableException(String.format(ExceptionMessages.COMPANY_SERVICE_NOT_AVAILABLE_WITH_MESSAGE, e.getMessage()));
}
public CompanyResponse fallBackMethodCompanyService(String companyId, Exception e) {
System.out.println("From Exception");
throw new ServiceUnAvailableException(String.format(ExceptionMessages.COMPANY_SERVICE_NOT_AVAILABLE_WITH_MESSAGE, e.getMessage()));
}
}
Так вот вопрос, почему CircuitBreaker не перехватывает этот exception?. При вызове летит
feign.RetryableException: Service unavailable
2024-09-27T20:07:23.654552662Z at org.example.projectservice.config.MyDecoder.decode(MyDecoder.java:21) ~[classes/:0.0.1-SNAPSHOT]
2024-09-27T20:07:23.654555808Z at feign.InvocationContext.decodeError(InvocationContext.java:126) ~[feign-core-13.3.jar:na]
2024-09-27T20:07:23.654558383Z
Летит именно RetryableException, а не перехват. А иногда вылетает следующее
java.net.UnknownHostException: fc1fce880bb4
2024-09-27T20:25:15.791819608Z at java.base/sun.nio.ch.NioSocketImpl.connect(Unknown Source) ~[na:na]
2024-09-27T20:25:15.791824077Z at java.base/java.net.Socket.connect(Unknown Source) ~[na:na]