Abhilash Mangalan
Abhilash Mangalan

Reputation: 39

Springboot - 405 error when there is 5 seconds sleep in RestController

I am using a RestController in Springboot application. in controller method I am putting Thread.sleep for 5 seconds. But when I try from PostMan, it shows 405 error right away, but after 5 seconds it is coming to conroller breakpoint. Same thing happens from client app also, not postman related. Anybody faced this situation ? I am stuck at this point. If sleep is removed, it works perfectly fine. Why it is not waiting for 5 second and throwing 405 right away.. Please help..

@RestController
@RequestMapping("/user")
public class UserController {

    @Autowired
    UserService userService;
    

    @RequestMapping(value = "/users", method = RequestMethod.GET)
    public List<User> getAllUsers() {
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
        System.out.println("In getAllUsers");
        return userService.findAllUsers();
    }
}

enter image description here

I am accessing the service through an API gate way and 9191 is the port. Please find the yaml for api gateway. This problem does not exist if I access the user service directly. Also not sure why it is showing 405, when sleep in user service and works perfectly without 405 in the absence of sleep.

eureka:
  instance:
    client:
      serviceUrl:
        defaultZone: http://localhost:8761/eureka/
management:
  endpoints:
    web:
      exposure:
        include: '*'
server:
  port: 9191
spring:
  application:
    name: API-GATEWAY
  cloud:
    gateway:
      httpclient:
        connect-timeout: 10000
        response-timeout: 7s
      routes:
        -   filters:
              -   args:
                    fallbackUri: forward:/fallback/userServiceFallback
                    name: userServiceCircuitBreaker
                  name: CircuitBreaker
            id: USER-SERVICE
            predicates:
              - Path=/user/*
            uri: lb://USER-SERVICE
  main:
    web-application-type: reactive

Upvotes: 1

Views: 522

Answers (2)

Kshitij
Kshitij

Reputation: 657

You can add following properties to your application.yml file

resilience4j:
  timelimiter:
    instances:
      iamServiceCircuitBreaker:
        timeoutDuration: 10s
        cancelRunningFuture: true
      carefloServiceCircuitBreaker:
        timeoutDuration: 10s
        cancelRunningFuture: true

Upvotes: 0

Abhilash Mangalan
Abhilash Mangalan

Reputation: 39

Resolved this issue. It was because of the absence of time out configuration for Spring cloud gateway. Added below code.

@Bean
public ReactiveResilience4JCircuitBreakerFactory reactiveResilience4JCircuitBreakerFactory(
            CircuitBreakerRegistry circuitBreakerRegistry) {
        ReactiveResilience4JCircuitBreakerFactory reactiveResilience4JCircuitBreakerFactory =
                new ReactiveResilience4JCircuitBreakerFactory();
        reactiveResilience4JCircuitBreakerFactory.configureCircuitBreakerRegistry(circuitBreakerRegistry);

        TimeLimiterConfig timeLimiterConfig = TimeLimiterConfig.custom()
                .timeoutDuration(Duration.ofSeconds(10)).cancelRunningFuture(true)
                .build();
        reactiveResilience4JCircuitBreakerFactory.configure(builder -> builder.timeLimiterConfig(timeLimiterConfig)
                .build(),"userServiceCircuitBreaker","departmentServiceCircuitBreaker");
        return reactiveResilience4JCircuitBreakerFactory;
    }

Upvotes: 0

Related Questions