Hystrix fallback method is not invoked
Asked Answered
O

8

5

I'm trying hystrix fallback method. On localhost:8082, customer-service is running which returns name of the customer.

If the customer-service is down, fallback method should invoke. But it is not happening.

Below is the code snippet.

Please suggest.

@SpringBootApplication
@EnableDiscoveryClient
@EnableCircuitBreaker
@RestController
public class DemoHystrixApplication {

    @GetMapping("/")
    public String name() {
        String str = getCustomerName();
        return str;
    }

    @HystrixCommand(fallbackMethod = "getFallbackCustomerName")
    private String getCustomerName() {
        RestTemplate restTemplate = new RestTemplate();
        URI uri = URI.create("http://localhost:8082");
        return restTemplate.getForObject(uri, String.class);
    }

    private String getFallbackCustomerName() {
        System.out.println("coming inside fallback method");
        return "Resillient Customer";
    }

    public static void main(String[] args) {
        SpringApplication.run(DemoHystrixApplication.class, args);
    }
}
Otiliaotina answered 18/12, 2016 at 16:22 Comment(0)
E
5

Both the methods i.e. the actual and fallback methods should be public and move these methods to a separate class and annotate it with @Component.

Give a try, hope this helps.

Ephesians answered 18/12, 2016 at 17:37 Comment(2)
why separate class?Odoriferous
@Odoriferous It is just a suggestion to separate the @ SpringBootApplication, @ Controller, and @ Service/@ Component, instead of all the code at one place. Just a coding best practice suggestion, as over the period of time there will lot of code at one place and difficult to manage.Ephesians
T
1

Your @HystrixCommand annotated method should be public. Not sure about the fallback method but I would set it public as well.

Thekla answered 18/12, 2016 at 16:57 Comment(0)
P
1

This is because of AOP.

The Spring container injects aspect-aware bean when injecting a bean.

When the name() function is called at the user's request, the method of the aspect-aware bean is called so annotation works.

However, calling this.getCustomerName() directly within the name() calls getCustomerName() on the raw bean before it is wrapped in proxy. It doesn't know aspect. Therefore, annotation does not work.

Petiolule answered 30/7, 2019 at 8:55 Comment(0)
P
0

You can also try stopping and starting the service, if you added the dependency of netflix-hystrix and have dev-tools to pick up changes while executing the service.

Pompea answered 14/8, 2019 at 1:31 Comment(0)
T
0

Fallback metod should be called from another bean. The problem is you are calling fallback method from RestController.

Tyrontyrone answered 13/6, 2021 at 6:5 Comment(0)
E
0

You can try this because of HystrixComman is aspect

@Bean
@Primary
@Order(value= Ordered.HIGHEST_PRECEDENCE)
public HystrixCommandAspect hystrixAspect() {
    return new HystrixCommandAspect();
}
Eboni answered 31/7, 2023 at 14:21 Comment(0)
S
0

The @HystrixCommand annotated method should be public. The fallback method can be private as well.

Shayneshays answered 24/8, 2023 at 14:43 Comment(0)
J
0

Adding to @David ' s answer. Reason for moving these methods to separate class and it works is, "Proxy class". When we add fallback method, then Spring container creates a proxy class over our class. Spring has control over what to do in case of a fault. So when we break down our code into different methods, Spring lose the control, and hence the solution is to move that method into another bean.

Jemena answered 18/8 at 23:1 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.