我观察到Hystrix将所有来自命令的异常视为断路故障.它包括从命令run()方法抛出并由Hystrix本身创建的异常,例如: HystrixTimeoutException.

但我有从run()方法抛出的业务异常,表示服务响应有效错误,必须进一步处理.

这种异常的一个例子是使用SpringWS的WebServiceTemplate时的WebServiceFaultException.

所以我不需要那些特定的例外来使电路跳闸.

如何实现这种行为?

有一种明显的方法可以将业务异常包装到holder对象中,从run()方法返回它,然后将它展开回Exception并重新抛出.但它想知道是否有更清洁的方式.

最佳答案 有以下解决方案.

返回异常而不是抛出

最直接和最脏的方法.这看起来有点时髦,因为你必须将命令擦除到Object并且有很多类型转换.

Observable observable = new HystrixCommand() {

@Override

protected Object run() throws Exception {

try {

return doStuff(...);

} catch (BusinessException e) {

return e; // so Hystrix won't treat it as a failure

}

}

})

.observe()

.flatMap(new Func1>() {

@Override

public Observable call(Object o) {

if (o instanceof BusinessException) {

return Observable.error((BusinessException)o);

} else {

return Observable.just((BusinessResponse)o);

}

}

});

使用holder对象来保存结果和异常

这个apporach需要引入额外的持有者类(也可以用于其他目的).

class ResultHolder {

private T result;

private E exception;

public ResultHolder(T result) {

this.result = result;

}

public ResultHolder(E exception) {

if (exception == null) {

throw new IllegalArgumentException("exception can not be null");

}

this.exception = exception;

}

public T get() throws E {

if (exception != null) {

throw exception;

} else {

return result;

}

}

public Observable observe() {

if (exception != null) {

return Observable.error(exception);

} else {

return Observable.just(result);

}

}

@SuppressWarnings("unchecked")

public static ResultHolder wrap(BusinessMethod method) {

try {

return new ResultHolder<>(method.call());

} catch (Exception e) {

return new ResultHolder<>((E)e);

}

}

public static Observable unwrap(ResultHolder holder) {

return holder.observe();

}

interface BusinessMethod {

T call() throws E;

}

}

现在使用它的代码看起来更干净,唯一的缺点可能是相当多的泛型.此方法在Java 8中也是最好的,其中lambdas和方法引用可用,否则它看起来很笨重.

new HystrixCommand>() {

@Override

protected ResultHolder run() throws Exception {

return ResultHolder.wrap(() -> doStuff(...));

}

}

.observe()

.flatMap(ResultHolder::unwrap);

使用HystrixBadRequestException

HystrixBadRequestException是一种特殊的异常,在断路器和指标方面不会算作失败.如documentation所示:

Unlike all other exceptions thrown by a HystrixCommand this will not

trigger fallback, not count against failure metrics and thus not

trigger the circuit breaker.

HystrixBadRequestException的实例不是由Hystrix本身创建的,因此将其用作业务异常的包装是安全的.但是,原始业务异常仍需要解包.

new HystrixCommand() {

@Override

protected BusinessResponse run() throws Exception {

try {

return doStuff(...);

} catch (BusinessException e) {

throw new HystrixBadRequestException("Business exception occurred", e);

}

}

}

.observe()

.onErrorResumeNext(e -> {

if (e instanceof HystrixBadRequestException) {

e = e.getCause(); // Unwrap original BusinessException

}

return Observable.error(e);

})

业务异常 java_java – 具有业务异常的Hystrix断路器相关推荐

  1. 爱上MVC~业务层刻意抛出异常,全局异常的捕获它并按格式返回

    对于业务层的程序的致命错误,我们一直的做法就是直接抛出指定的异常,让程序去终断,这种做法是对的,因为如果一个业务出现了致命的阻塞的问题,就没有必要再向上一层一层的返回了,但这时有个问题,直接抛异常,意 ...

  2. 异常导致循环退出_Java异常有哪些?异常怎么处理?

    有金钱之外的思想,保留一点自己值得自傲的地方,人生活得更加有意义. 简介 写程序的过程中,会遇到很多问题.比如:你写了个接口,然后用户输入的接口参数并不满足你的要求,导致程序出了一些问题,这个时候我就 ...

  3. 抛出运行时异常的目的_「JAVA」运行时异常、编译时异常、自定义异常,通过案例实践转译和异常链...

    Java基础之异常处理机制 什么是异常 从事Java开发的小伙伴对于"异常"应该不陌生,因为每天都会遇到不少异常,或捕获,或抛出.那究竟什么是异常?异常即非正常的,不同于平常.一般 ...

  4. php 错误 异常,php中的异常和错误解析

    PHP错误是属于php程序自身的问题,一般是由非法的语法,环境问题导致的,使得编译器无法通过检查甚至无法运行的情况.PHP异常一般是业务逻辑上出现的不合预期.与正常流程不同的状况,不是语法错误.本文介 ...

  5. numberformatexception是什么异常_处理Java异常的9个最佳实践

    Java中的异常处理不是一个简单的主题.初学者发现很难理解,甚至有经验的开发人员也可以花几个小时讨论如何以及应该抛出或处理哪些异常. 这就是为什么大多数开发团队都有自己的如何使用它们的规则.如果你是一 ...

  6. java 异常返回json_Spring MVC全局异常后返回JSON异常数据

    问题: 当前项目是作为手机APP后台支持,使用spring mvc + mybaits + shiro进行开发.后台服务与手机端交互是发送JSON数据.如果后台发生异常,会直接返回异常页面,显示异常内 ...

  7. java 负数异常_java基础之异常

    一.Throw(抛出异常,让调用者处理) Throw(将异常抛给调用者) 在java中,提供了一个throw关键字,它用来抛出一个指定的异常对象.那么,抛出一个异常具体如何操作呢? 1. 创建一个异常 ...

  8. php try 错误_PHP异常和错误(2)异常的基本处理:try

    前言: 异常是程序运行中不符合预期的情况,以及与正常流程不同的情况.属于逻辑和业务中断的情况,不属于语法错误.但是,异常不处理,在php中会议错误的形式出现,so,我们一起来看看PHP中是怎么处理异常 ...

  9. 云服务显示服务器异常,云服务器显示异常登录

    云服务器显示异常登录 内容精选 换一换 云服务器列表页面,云服务器的状态显示为"异常".进入云服务器列表页面,鼠标移动至"异常"状态处,查看具体的异常原因.查看 ...

最新文章

  1. 2022-2028年中国锂电材料产业投资分析及前景预测报告
  2. Cocos Studio的动画系统介绍
  3. 向现有对象实例添加方法
  4. 软件管理定律系列之布鲁克斯定律
  5. connectionString加密
  6. codechef LEMOVIE dp
  7. html ie7高度,在HTML,IE6和IE7中工作的HTML垂直和水平居中的实用解决方案
  8. java的reentrantlock_Java并发之ReentrantLock详解
  9. 车和家李想批国内电动车虚假里程宣传:特斯拉都打到家门口了别自嗨了
  10. PHP,mysql,Linux,CI框架学习总结
  11. markdown转换html源码,利用Nodejs+Express将Markdown转换为HTML(附源码)
  12. LInux下CAN滤波时间,linux下can调试工具canutils安装过程记录
  13. VSCode的VUE项目侧边栏打开资源管理器中的NPM脚本
  14. 将1自动补位为01_英雄联盟如何避免被自动补位到辅助位置
  15. 关于字符串中length与length()的区别
  16. 腾讯云轻量服务器性能评测:配置 8核 16G 18M 带宽
  17. 魔力宝贝手游版 服务器维护,魔力宝贝手游10月24日更新维护公告 各大更新内容...
  18. 赢在项目工具的落地-讲师团俊平老师主讲
  19. html文字跳动特效,Javascrip实现文字跳动特效
  20. 华为鸿蒙麒麟玉兔_华为系统为“鸿蒙”,手机芯片为“麒麟”,这些命名有何含义?...

热门文章

  1. VCIX-NV学习指南
  2. Veeam FAQ系列转载(三)
  3. Json学习总结(3)——Jsonp跨域及Rest接口实现
  4. 互联网推送服务原理:长连接+心跳机制(MQTT协议)
  5. echarts地图动画和java_echarts 实现中国地图
  6. jQuery.Validate 验证,以及 remote验证, 多参数传递
  7. Check_ping监控测试原理
  8. 在PhpStorm中管理GitHub代码仓库的使用方法
  9. PHP 02 PHP的基础语法
  10. python_线程读写操作一