Стивен
Я не самый опытный в этой части c, но, глядя на ваш код, кажется мне подходящим . Когда сервер возвращает 404 Not found
, это не указывает на сбой или ошибку службы, но этот ресурс просто не найден. Если в вашем случае 404
означает, что произошла ошибка и запрос должен быть повторен с resilient approach
, вы должны выбросить это исключение , чтобы сообщить Resilience4J, что что-то пошло не так.
Пока мы работаем над улучшением нашей документации, я рекомендую вам взглянуть на существующее руководство , объясняющее устойчивость в контексте SAP Cloud SDK . Там мы также добавляем ResilienceRuntimeException
для ясности:
public List<BusinessPartner> execute() {
return ResilienceDecorator.executeSupplier(this::run, myResilienceConfig, e -> {
logger.warn("Fallback called because of exception.", e);
return Collections.emptyList();
});
}
private List<BusinessPartner> run() {
try {
return businessPartnerService
.getAllBusinessPartner()
.select(BusinessPartner.BUSINESS_PARTNER,
BusinessPartner.LAST_NAME,
BusinessPartner.FIRST_NAME,
BusinessPartner.IS_MALE,
BusinessPartner.IS_FEMALE,
BusinessPartner.CREATION_DATE,
BusinessPartner.TO_BUSINESS_PARTNER_ADDRESS
.select(BusinessPartnerAddress.CITY_NAME,
BusinessPartnerAddress.COUNTRY,
BusinessPartnerAddress.TO_EMAIL_ADDRESS
.select(AddressEmailAddress.EMAIL_ADDRESS)
)
)
.filter(BusinessPartner.BUSINESS_PARTNER_CATEGORY.eq(CATEGORY_PERSON))
.orderBy(BusinessPartner.LAST_NAME, Order.ASC)
.top(200)
.execute(destination);
} catch (ODataException e) {
throw new ResilienceRuntimeException(e);
}
}
Что касается фрагмента кода из DestinationService
, я считаю, что метод fetchDestinationsJson()
вызывает неявное исключение, таким образом давая Resilience4J знать, что что-то пошло не так. Хотя в вашем случае HttpClient не выдаст ничего при получении 404
, поскольку это правильный код ответа, как и любой другой.
Я также думаю, что проверка CircuitsBreaker
примеров из библиотеки Resilience4J может оказаться полезной .
Надеюсь, это поможет:)