上一节中讲到了HystrixCommand有四种执行方法,这一节就来讲一下这四种方法直接的关系以及他们的实现。

  execute方法使用同步方式获取结果,本质是调用了queue方法获取了一个Future,然后通过该Future获取返回结果。

public R execute() {
try {
return queue().get();
} catch (Exception e) {
throw Exceptions.sneakyThrow(decomposeException(e));
}
}

  queue方法通过异步方式活动结果,本质是通过toObservable方法获取了一个Observable,然后通过该Observable获得一个Future

public Future<R> queue() {
...
final Future<R> delegate = toObservable().toBlocking().toFuture();
...
};

  observe方法通过Observable实现异步,并且该Observable无论在任何时候监听,都可以接收到所有消息。本质是使用了一个ReplaySubject监听toObservable返回的Observable,然后再返回该ReplaySubject。

public Observable<R> observe() {
ReplaySubject<R> subject = ReplaySubject.create();
final Subscription sourceSubscription = toObservable().subscribe(subject);
...
return subject.doOnUnsubscribe(new Action0() {
@Override
public void call() {
sourceSubscription.unsubscribe();
}
});
}

  toObservable方法Observable实现异步,在Observable被监听时执行。本质是创建一个Observable,当这个Observable被监听时,执行run命令,并返回消息。

public Observable<R> toObservable() {
...
return Observable.defer(new Func0<Observable<R>>() {
@Override
public Observable<R> call() {
...
Observable<R> hystrixObservable =
Observable.defer(applyHystrixSemantics) //会调用run方法
.map(wrapWithAllOnNextHooks);
...
}
});
}

命令执行流程

  命令执行流程主要包含一下内容:

  1.熔断器判断

  2.各个阶段HystrixCommandExecutionHook调用。

  3.各个阶段

  4.发送metrics消息

执行流程:

1.执行HystrixCommandExecutionHook的onStart。

  2.通过熔断器判断服务是否熔断

  3.如果没有熔断

    3.1如果是SEMAPHORE模式

3.1.1 判断是否到达指定并发量,如果不是进入

          3.1.1.1 向metrics发送执行开始消息。

          3.1.1.2执行HystrixCommandExecutionHook的onRunStart、onExecutionStart方法

3.1.1.3执行run方法,并把执行结果返回Observable。

3.1.1.4监听Observable执行结果消息,如果返回消息是success、error、emit执行HystrixCommandExecutionHook相应方法。

        3.1.3 [handleSemaphoreRejectionViaFallback]

    3.2如果是THREAD模式

  3.2.1 向metrics发送执行开始消息。

  3.2.2 向metrics发送线程池执行开始消息。

   3.2.3 执行HystrixCommandExecutionHook的onThreadStart、onRunStart、onExecutionStart方法

  3.2.4 执行run方法,并把执行结果返回Observable。

  3.2.5 监听Observable执行结果消息,如果返回消息是success、error、emit执行HystrixCommandExecutionHook相应方法。

      3.2.6 如果线程执行过程中,发送TERMINAL,UNSUBSCRIBED,执行HystrixCommandExecutionHook的onThreadComplete方法,并向metrics发送线程池执行结束消息。

    2.3如果timeout检测启动,则启动定时器判断timeout检测。

    

4.如果熔断[handleShortCircuitViaFallback]

命令执行状态

  hystrix命令执行过程中有以下状态,hystrix命令的状态是不可逆的,每个hystrix命令只能使用一次:

    1. 初始状态(NOT_STARTED)。

    2.创建(OBSERVABLE_CHAIN_CREATED),toObservable开始执行后变为OBSERVABLE_CHAIN_CREATED状态

    3.用户代码执行( USER_CODE_EXECUTED),用户调用开始执行前变为USER_CODE_EXECUTED

    4.UNSUBSCRIBED,

    5.TERMINAL

  hystrix命令执行过程中线程有一下状态:

    1. 初始状态(NOT_USING_THREAD)。

    2.开始(STARTED),通过线程池方式执行命令前变为STARTED。

    3.UNSUBSCRIBED,

    4.TERMINAL

hystrix(6) 命令执行的更多相关文章

  1. saltstack命令执行过程

    saltstack命令执行过程 具体步骤如下 Salt stack的Master与Minion之间通过ZeroMq进行消息传递,使用了ZeroMq的发布-订阅模式,连接方式包括tcp,ipc salt ...

  2. HFS远程命令执行漏洞入侵抓鸡黑阔服务器

    先来科普一下: HFS是什么? hfs网络文件服务器 2.3是专为个人用户所设计的HTTP档案系统,如果您觉得架设FTP Server太麻烦,那么这个软件可以提供您更方便的网络文件传输系统,下载后无须 ...

  3. ping命令执行过程详解

    [TOC] ping命令执行过程详解 机器A ping 机器B 同一网段 ping通知系统建立一个固定格式的ICMP请求数据包 ICMP协议打包这个数据包和机器B的IP地址转交给IP协议层(一组后台运 ...

  4. 【MongoDB】6.关于MongoDB存储文件的 命令执行+代码执行

    参考:http://www.runoob.com/mongodb/mongodb-gridfs.html 1.命令执行 MongoDB GridFS GridFS 用于存储和恢复那些超过16M(BSO ...

  5. SQL Server数据库备份:通过Windows批处理命令执行

    通过Windows批处理命令执行SQL Server数据库备份 建立mybackup.bat ,输入以下内容直接运行该脚本,即可开始自动备份数据库也可把该脚本加入windows任务计划里执行. --- ...

  6. 图解“管道过滤器模式”应用实例:SOD框架的命令执行管道

    管道和过滤器 管道和过滤器是八种体系结构模式之一,这八种体系结构模式是:层.管道和过滤器.黑板.代理者.模型-视图-控制器(MVC) 表示-抽象-控制(PAC).微核.映像. 管道和过滤器适用于需要渐 ...

  7. "Java 反序列化"过程远程命令执行漏洞

    一.漏洞描述   国外 FoxGlove 安全研究团队于2015年11月06日在其博客上公开了一篇关于常见 Java 应用如何利用反序列化操作进行远程命令执行的文章.原博文所提到的 Java 应用都使 ...

  8. ASP代码审计 -4.命令执行漏洞总结

    命令执行漏洞: 保存为cmd.asp,提交链接: http://localhost/cmd.asp?ip=127.0.0.1 即可执行命令 <%ip=request("ip" ...

  9. Linux:命令执行顺序控制与管道

    命令执行顺序控制与管道 顺序执行 简单的顺序命令可以使用符号";"完成,如:sudo apt-get update;sudo apt-get install some-tool;s ...

随机推荐

  1. css3 属性 text-overflow 实现截取多余文字内容 以省略号来代替多余内容

    css3 属性 text-overflow: ellipsis 前言 正文 结束语 前言 我们在设计网站的时候有时会遇到这样一个需求:因为页面空间大小的问题,需要将多余的文字隐藏起来,并以省略号代替, ...

  2. yum安装软件时,提示No package netstat available.的解决方法

    1. 序言 如笔者在本机上运行netstat时,提示没有这个命令,向来简单粗暴,直接yum -y install netstat,显然是不能正常安装的. [root@hadoop-103 ~]# yu ...

  3. ganglia访问时出现"You don't have permission to access /ganglia/ on this server"

    安装ganglia后,访问浏览器出现"You don't have permission to access /ganglia/ on this server" 按照网络上的要求配 ...

  4. python基础 Day6

    python Day6 id 可以获得python的内存地址 id的举例子 a=100 print(id(a)) #140712544153072 这里就是该对象的内存地址 is 判断的是比较内存地址 ...

  5. centos yum 安装golang

    rpm -Uvh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm yum install golan ...

  6. 计算机网络-网络层(2)NAT协议

    网络地址转换(NAT,Network Address Translation)协议: 本地网络内通信的IP数据报的源与目的IP地址均在子网10.0.0.0/24内:所有离开本地网络去往Internet ...

  7. P1227 【[JSOI2008]完美的对称】

    这道题,先讲一下我的做题思路 这道题的最主要的目的就是算出中心,我下面称为中点.这个中点其实很好算的,我们只需要算出最左下角的坐标和最右上角的坐标,然后用中点坐标公式算出来就ok了,那么这道题就做完了 ...

  8. h5c3

    HTML5 第一天 一.什么是 HTML5 HTML5 的概念与定义 定义:HTML5 定义了 HTML 标准的最新版本,是对 HTML 的第五次重大修改,号称下一代的 HTML 两个概念: 是一个新 ...

  9. Javascript常见数据类型API

    1 - 内置对象 1.1 内置对象 ​ JavaScript 中的对象分为3种:自定义对象 .内置对象. 浏览器对象 ​ 前面两种对象是JS 基础 内容,属于 ECMAScript: 第三个浏览器对象 ...

  10. AD18 PCB中添加中文字符串显示乱码问题解决

    该问题是由于字符串的自体类型设置问题,AD默认是[stroke],我们点击[TrueType]即可正常显示.PS:AD18搞啥呢,默认显示输入内容不行吗,找半天!!!