当前位置: 首页 > 知识库问答 >
问题:

如何记录hystrix fallback方法调用的原因

柯锋
2023-03-14

我正在使用Fiegn创建一个REST客户端。我已经让我的调用正常工作了,但我想记录回退方法调用的异常which tigger
代码如下:

public interface FooService {
    Foo queryFoo(Integer fooId);
}

public interface FooServiceFallback implements FooService {
    @Override
    Foo queryFoo(Integer fooId) {
        return new Foo();
    }
}

@Configuration
public class FooServiceConfiguration {
    @Bean
    public FooService() {
        return HystrixFeign.builder().[...].target(FooService.class, "http://xxx", FooServiceFallback.class);
    }
}

发生异常时可以调用回退方法,但记录注意事项。

如何记录触发调用的回退方法的异常?
如connectionTimeoutException。

共有1个答案

贾成天
2023-03-14

回退方法可以使用类型为Throwable的额外参数,这将指示原因。

例如,如果你的方法是这样的

@HystrixCommand(fallbackMethod = "fallbackMethod")
public String mainMethod(String s) {
 .....
}

你的后备方法可以是这样的

public String fallbackMethod(String s) {
     ......
}

public String fallbackMethod(String s, Throwable throwable) {
     //log the cause using throwable instance
     ......
}

在你的情况下使用第二个。

编辑:

如果您使用的是HystrixFeign,这就是您的操作方式。你应该使用FallbackFactory

@Component
public class FooServiceFallbackFactory implements FallbackFactory<FooService> {

    @Override
    public FooService create(Throwable throwable) {
        return new FooServiceFallback(throwable);
    }

}

你的后备班看起来像

@Component
public class FooServiceFallback implements FooService {

   private final Throwable cause;

   public FooServiceFallback(Throwable cause) {
      this.cause = cause;
   }

   @Override
   Foo queryFoo(Integer fooId) {
       //You have access to cause now, which will have the real exception thrown
   }

}

此外,还需要更改一些配置类

@Configuration
public class FooServiceConfiguration {
    @Bean
    public FooService() {
        return HystrixFeign.builder().[...].target(FooService.class, "http://xxx", FooServiceFallbackFactory.class);
    }
}
 类似资料:
  • 问题内容: 如何使用Python的文档字符串使用参数记录方法? 编辑: PEP 257给出了这个例子: 这是大多数Python开发人员使用的约定吗? 我期待一些更正式的东西,例如 环境 :Python 2.7.1 问题答案: 根据我的经验,numpy的文档字符串公约(PEP257超集)是最广泛的传播 遵循 惯例,它们也通过工具,如支持的狮身人面像。 一个例子:

  • 问题内容: 我有一个带有数据库调用的类,并且我通常想用log4j记录该类中每个被调用的方法(带有参数): 是否可以自动执行此操作?也许通过在每种方法的开头使用某种注释,而不是编写每个logger.debug? 今天,每次更改参数或方法名称时,我都必须更新我的logging.debug。 问题答案: 从jcabi- aspects 尝试注释和AspectJ 方面(我是开发人员): 所有方法调用均通过

  • 我正在尝试使用Spring 5 WebClient记录请求。你知道我怎样才能做到吗? (我使用的是Spring5和Spring靴2) 代码目前如下所示:

  • 问题内容: 如果重写了JavaScript中的原型方法,则可以调用该基础方法吗? 问题答案: 我不明白您到底想做什么,但是通常按照以下方式完成特定于对象的行为:

  • 问题内容: 是否有可能在springframework中记录方法所花费的时间?全部]自动。我的意思是,我不想进入每种方法并编写log.debug(“ ....”); 东西。 问题答案: AOP是您在这里需要的。AOP允许您将代码添加到您的应用程序,而无需修改原始代码。Spring AOP倾向于使用 Proxy 对象来完成此任务。 代理 对象使用装饰器模式包装原始 Target 对象并添加代码。所述

  • 本文向大家介绍MongoDB如何查询耗时记录的方法详解,包括了MongoDB如何查询耗时记录的方法详解的使用技巧和注意事项,需要的朋友参考一下 准备 在此之前,我们先在我们的数据库中插入10万条数据。数据的格式是这样的: explain explain方法是用来查看db.collecion.find()的一些查询信息的。例如: explain方法有个可选的参数verbose,是个字符串,他表示的是