Я использую автоматический выключатель с помощью Hystrix в моем загрузочном приложении Spring, мой код выглядит примерно так:
@service
public class MyServiceHandler {
@HystrixCommand(fallbackMethod="fallback")
public String callService() {
// if(remote service is not reachable
// throw ServiceException
}
public String fallback() {
// return default response
}
}
// In application.properties, I have below properties defined:
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=10000
hystrix.command.default.circuitBreaker.requestVolumeThreshold=3
hystrix.command.default.circuitBreaker.sleepWindowInMilliseconds=30000
hystrix.threadpool.default.coreSize=4
hystrix.threadpool.default.metrics.rollingStats.timeInMilliseconds=200000
Я вижу, что функция fallback () вызывается при каждом сбое callService()
. Однако после 3 сбоев цепь не размыкается. После 3 сбоев я ожидал, что он напрямую вызовет fallback()
и пропустит callService()
. Но этого не происходит. Может кто-нибудь посоветовать, что я здесь делаю не так?
Спасибо, B Jagan
Отредактировано 26 июля, чтобы добавить дополнительную информацию ниже:
Ниже приведен фактический код. Я немного поиграл с этим. Я вижу, что схема открывается должным образом при повторном сбое, когда я вызываю удаленную службу непосредственно в методе RegistrationHystrix.registerSeller (). Но когда я помещаю вызов удаленной службы в шаблон повторной попытки Spring, он продолжает переходить в резервный метод, но цепь никогда не открывается.
@Service
public class RegistrationHystrix {
Logger logger = LoggerFactory.getLogger(RegistrationHystrix.class);
private RestTemplate restTemplate;
private RetryTemplate retryTemplate;
public RegistrationHystrix(RestTemplate restTemplate) {
this.restTemplate = restTemplate;
retryTemplate = new RetryTemplate();
FixedBackOffPolicy fixedBackOffPolicy = new FixedBackOffPolicy();
fixedBackOffPolicy.setBackOffPeriod(1000l);
retryTemplate.setBackOffPolicy(fixedBackOffPolicy);
SimpleRetryPolicy retryPolicy = new SimpleRetryPolicy();
retryPolicy.setMaxAttempts(3);
retryTemplate.setRetryPolicy(retryPolicy);
}
@HystrixCommand(fallbackMethod = "fallbackForRegisterSeller", commandKey = "ordermanagement")
public String registerSeller(SellerDto sellerDto) throws Exception {
String response = retryTemplate.execute(new RetryCallback<String, Exception>() {
@Override
public String doWithRetry(RetryContext context) {
logger.info(String.format("Retry count %d", context.getRetryCount()));
return restTemplate.postForObject("/addSeller", sellerDto, String.class);
}
});
return response;
}
public List<SellerDto> getSellersList() {
return restTemplate.getForObject("/sellersList", List.class);
}
public String fallbackForRegisterSeller(SellerDto sellerDto, Throwable t) {
logger.error("Inside fall back, cause - {}", t.toString());
return "Inside fallback method. Some error occured while calling service for seller registration";
}
}
Ниже приведен класс обслуживания, который, в свою очередь, вызывает вышеупомянутую завернутую службу Hystrix. Этот класс, в свою очередь, вызывается контроллером.
@Service
public class RegistrationServiceImpl implements RegistrationService {
Logger logger = LoggerFactory.getLogger(RegistrationServiceImpl.class);
private RegistrationHystrix registrationHystrix;
public RegistrationServiceImpl(RegistrationHystrix registrationHystrix) {
this.registrationHystrix = registrationHystrix;
}
@Override
public String registerSeller(SellerDto sellerDto) throws Exception {
long start = System.currentTimeMillis();
String registerSeller = registrationHystrix.registerSeller(sellerDto);
logger.info("add seller call returned in - {}", System.currentTimeMillis() - start);
return registerSeller;
}
Итак, я пытаюсь понять, почему автоматический выключатель не работает должным образом при использовании его вместе с Spring RetryTemplate.