Search code examples
javaspring-bootspring-restcontroller

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

Solution

  • 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;
        }