2

I want to call a third party API. I use spring cloud circuit breaker resilience4j.

Here is my service class :

package ir.co.isc.resilience4jservice.service;

import ir.co.isc.resilience4jservice.model.Employee;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.circuitbreaker.CircuitBreaker;
import org.springframework.cloud.client.circuitbreaker.CircuitBreakerFactory;
import org.springframework.cloud.client.circuitbreaker.NoFallbackAvailableException;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;

 @Service
public class EmployeeService {

@Autowired
private RestTemplate restTemplate;

@Autowired
private CircuitBreakerFactory circuitBreakerFactory;

public Employee getEmployee() {
    try {
        String url = "http://localhost:8090/employee";

        CircuitBreaker circuitBreaker = circuitBreakerFactory.create("circuit-breaker");

        return circuitBreaker.run(() -> restTemplate.getForObject(url, Employee.class));
    } catch (NoFallbackAvailableException e) {
        //I should extract error response body and do right action then return correct answer
        return null;
    }
   }
 }

ResilienceConfig:

package ir.co.isc.resilience4jservice.config;

import io.github.resilience4j.circuitbreaker.CircuitBreakerConfig;
import io.github.resilience4j.timelimiter.TimeLimiterConfig;
import org.springframework.cloud.circuitbreaker.resilience4j.Resilience4JCircuitBreakerFactory;
import org.springframework.cloud.circuitbreaker.resilience4j.Resilience4JConfigBuilder;
import org.springframework.cloud.client.circuitbreaker.Customizer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.time.Duration;

@Configuration
public class CircuitBreakerConfiguration {

@Bean
public Customizer<Resilience4JCircuitBreakerFactory> defaultCustomizer() {
    CircuitBreakerConfig circuitBreakerConfig = CircuitBreakerConfig.custom()
            .slidingWindowType(CircuitBreakerConfig.SlidingWindowType.COUNT_BASED)
            .slidingWindowSize(10)
            .minimumNumberOfCalls(10)
            .failureRateThreshold(25)
            .permittedNumberOfCallsInHalfOpenState(3)
            .build();

    TimeLimiterConfig timeLimiterConfig = TimeLimiterConfig.custom()
            .timeoutDuration(Duration.ofSeconds(4))
            .build();

    return factory ->
            factory.configureDefault(id -> new Resilience4JConfigBuilder(id)
                    .circuitBreakerConfig(circuitBreakerConfig)
                    .timeLimiterConfig(timeLimiterConfig)
                    .build());
    }

 }

in some situation third party api return ResponseEntity with statusCode = 500 and body = {"errorCode":"CCBE"}.

response is look like this :

[503] during [POST] to [http://localhost:8090/employee]:[{"errorCode":"CCBE"}] 

When I call this API and get internal server error with body, my catch block catchs api response. In catch block I need retrieve response body and do some actions according to errorCode.

But I can not do this.

How can I extract body in this situation?

mahdieh
  • 156
  • 3
  • 13

0 Answers0