概述
08:20:05.488 [hystrix-testThreadPool-1] INFO c.c.d.h.HttpGetterCommand - 第1次请求-> begin…
08:20:08.698 [hystrix-testThreadPool-1] INFO c.c.d.h.HttpGetterCommand - 第1次请求-> end!
08:20:08.708 [main] INFO c.c.d.h.CommandTester - 第1次请求的结果:{“status”:200,“msg”:“操作成功”,“data”:{“hello”:“world”}}
08:20:08.710 [hystrix-testThreadPool-2] INFO c.c.d.h.HttpGetterCommand - 第2次请求-> begin…
08:20:10.741 [hystrix-testThreadPool-2] INFO c.c.d.h.HttpGetterCommand - 第2次请求-> end!
08:20:10.744 [main] INFO c.c.d.h.CommandTester - 第2次请求的结果:{“status”:200,“msg”:“操作成功”,“data”:{“hello”:“world”}}
08:20:10.751 [hystrix-testThreadPool-3] INFO c.c.d.h.HttpGetterCommand - 第3次请求-> begin…
08:20:12.766 [hystrix-testThreadPool-3] INFO c.c.d.h.HttpGetterCommand - 第3次请求-> end!
08:20:12.767 [main] INFO c.c.d.h.CommandTester - 第3次请求的结果:{“status”:200,“msg”:“操作成功”,“data”:{“hello”:“world”}}
//省略后面的重复请求输出
从结果中可以看出,Hystrix会从线程池中取一个线程来执行HttpGetterCommand命令的run()方法,命令执行过程中,main线程一直在等待其返回值。
queue()方法
=========
HystrixCommand的queue()方法以异步非阻塞方式执行run()方法,该方法直接返回一个Future对象。可通过Future.get()拿到run()的返回结果,但Future.get()是阻塞执行的。
HystrixCommand的queue()方法的使用示例程序如下:
package com.crazymaker.demo.hystrix;
…
@Slf4j
public class HystryxCommandExcecuteDemo
{
@Test
public void testQueue() throws Exception {
/**
*使用统一配置
*/
HystrixCommand.Setter setter = getSetter(
“group-1”,
“testCommand”,
“testThreadPool”);
List<Future> flist = new LinkedList<>();
/**
*同时发起5个异步的请求
*/
for (int i = 0; i < COUNT; i++) {
Future future = new HttpGetterCommand(TEST_URL, setter).queue();
flist.add(future);
}
/**
*统一获取异步请求的结果
*/
Iterator<Future> it = flist.iterator();
int count = 1;
while (it.hasNext()) {
Future future = it.next();
String result = future.get(10, TimeUnit.SECONDS);
log.info(“第{}次请求的结果:{}”, count++, result);
}
Thread.sleep(Integer.MAX_VALUE);
}
}
运行这个示例程序前需要启动demo-provider实例,确保它的REST接口/api/demo/hello/v1可以正常访问。执行这个示例程序,主要的输出结果如下:
08:30:54.618 [hystrix-testThreadPool-2] INFO c.c.d.h.HttpGetterCommand - 第3次请求-> begin…
08:30:54.618 [hystrix-testThreadPool-1] INFO c.c.d.h.HttpGetterCommand - 第4次请求-> begin…
08:30:54.618 [hystrix-testThreadPool-4] INFO c.c.d.h.HttpGetterCommand - 第5次请求-> begin…
08:30:54.618 [hystrix-testThreadPool-3] INFO c.c.d.h.HttpGetterCommand - 第2次请求-> begin…
08:30:54.618 [hystrix-testThreadPool-5] INFO c.c.d.h.HttpGetterCommand - 第1次请求-> begin…
08:30:58.358 [hystrix-testThreadPool-2] INFO c.c.d.h.HttpGetterCommand - 第3次请求-> end!
08:30:58.358 [hystrix-testThreadPool-3] INFO c.c.d.h.HttpGetterCommand - 第2次请求-> end!
08:30:58.358 [hystrix-testThreadPool-1] INFO c.c.d.h.HttpGetterCommand - 第4次请求-> end!
08:30:58.358 [hystrix-testThreadPool-4] INFO c.c.d.h.HttpGetterCommand - 第5次请求-> end!
08:30:58.358 [hystrix-testThreadPool-5] INFO c.c.d.h.HttpGetterCommand - 第1次请求-> end!
08:30:58.364 [m
【一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义】
浏览器打开:qq.cn.hn/FTf 免费领取
ain] INFO c.c.d.h.CommandTester - 第1次请求的结果:{“status”:200,“msg”:“操作成功”,“data”:{“hello”:“world”}}
08:30:58.365 [main] INFO c.c.d.h.CommandTester - 第2次请求的结果:{“status”:200,“msg”:“操作成功”,“data”:{“hello”:“world”}}
08:30:58.365 [main] INFO c.c.d.h.CommandTester - 第3次请求的结果:{“status”:200,“msg”:“操作成功”,“data”:{“hello”:“world”}}
08:30:58.365 [main] INFO c.c.d.h.CommandTester - 第4次请求的结果:{“status”:200,“msg”:“操作成功”,“data”:{“hello”:“world”}}
08:30:58.365 [main] INFO c.c.d.h.CommandTester - 第5次请求的结果:{“status”:200,“msg”:“操作成功”,“data”:{“hello”:“world”}}
实际上,前面介绍的HystrixCommand的execute()方法是在内部使用queue().get()的方式完成同步调用的。
observe()方法
===========
HystrixCommand的observe()方法会返回一个响应式编程Observable主题,可以为该主题对象注册上Subscriber观察者回调实例,或者注册上Action1不完全回调实例来响应式处理命令的执行结果。
HystrixCommand的observe()方法的使用示例程序如下:
package com.crazymaker.demo.hystrix;
…
@Slf4j
public class HystryxCommandExcecuteDemo
{
@Test
public void testObserve() throws Exception
{
/**
*使用统一配置类
*/
HystrixCommand.Setter setter = SetterDemo.buildSetter(
“group-1”,
“testCommand”,
“testThreadPool”);
Observable observe = new HttpGetterCommand(HELLO_TEST_URL, setter).observe();
Thread.sleep(1000);
log.info(“订阅尚未开始!”);
//订阅3次
observe.subscribe(result -> log.info(“onNext result={}”, result),
error -> log.error(“onError error={}”, error));
observe.subscribe(result -> log.info(“onNext result ={}”, result),
error -> log.error(“onError error={}”, error));
observe.subscribe(
result -> log.info(“onNext result={}”, result),
error -> log.error(“onError error ={}”, error),
() -> log.info(“onCompleted called”));
Thread.sleep(Integer.MAX_VALUE);
}
}
运行这个示例程序前需要启动demo-provider实例,确保其REST接口/api/demo/hello/v1可以正常访问。执行这个示例程序,主要的输出结果如下:
[hystrix-testThreadPool-1] INFO c.c.d.h.HttpGetterCommand - req1 begin…
[main] INFO c.c.d.h.HystryxCommandExcecuteDemo - 订阅尚未开始!
[hystrix-testThreadPool-1] INFO c.c.d.h.HttpGetterCommand - req1 end: {“respCode”:0,“respMsg”:“操作成功”,“datas”:{“hello”:"wor
[hystrix-testThreadPool-1] INFO c.c.d.h.HystryxCommandExcecuteDemo - onNext result=req1:{“respCode”:0,“respMsg”:“操作成功”,"dat
[hystrix-testThreadPool-1] INFO c.c.d.h.HystryxCommandExcecuteDemo - onNext result =req1:{“respCode”:0,“respMsg”:“操作成功”,"da
[hystrix-testThreadPool-1] INFO c.c.d.h.HystryxCommandExcecuteDemo - onNext result=req1:{“respCode”:0,“respMsg”:“操作成功”,"dat
[hystrix-testThreadPool-1] INFO c.c.d.h.HystryxCommandExcecuteDemo - onCompleted called
通过执行结果可以看出,如果HystrixCommand的run()方法执行成功,就会触发订阅者的onNext()和onCompleted()回调方法,如果执行异常,就会触发订阅者的onError()回调方法。
调用HystrixCommand的observe()方法会返回一个热主题(Hot Observable)。什么是热主题呢?就是无论主题是否存在观察者订阅,都会自动触发执行它的run()方法。另外还有一点,observe()方法所返回的主题可以重复订阅。
toObservable()方法
=================
HystrixCommand的toObservable()方法会返回一个响应式编程Observable主题。同样可以为该主题对象注册上Subscriber观察者回调实例,或者注册上Action1不完全回调实例,来响应式处理命令的执行结果。不过,与observe()返回的主题不同,Observable主题返回的是冷主题,并且只能被订阅一次。
HystrixCommand的toObservable()方法的使用示例程序如下:
package com.crazymaker.demo.hystrix;
…
@Slf4j
public class HystryxCommandExcecuteDemo
{
@Test
public void testToObservable() throws Exception
{
/**
*使用统一配置类
*/
HystrixCommand.Setter setter = SetterDemo.buildSetter(
“group-1”,
“testCommand”,
“testThreadPool”);
for (int i = 0; i < COUNT; i++)
{
Thread.sleep(2);
new HttpGetterCommand(HELLO_TEST_URL, setter)
.toObservable()
.subscribe(result -> log.info(“result={}”, result),
error -> log.error(“error={}”, error)
);
}
Thread.sleep(Integer.MAX_VALUE);
}
}
运行这个示例前需要启动demo-provider实例,确保它的REST接口/api/demo/hello/v1可以正常访问。执行这个示例程序,主要的输出结果如下:
最后
以上就是冷傲电灯胆为你收集整理的HystrixRPC保护的原理,HystrixCommand命令的执行方法,java微服务面试题的全部内容,希望文章能够帮你解决HystrixRPC保护的原理,HystrixCommand命令的执行方法,java微服务面试题所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复