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();
}
}
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
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;
}