一起学习Hystrix--Hystrix命令执行


声明:本文转载自https://my.oschina.net/u/2342969/blog/1814480,转载目的在于传递更多信息,仅供学习交流之用。如有侵权行为,请联系我,我会及时删除。

目录

  • “Hello World!”
  • 同步执行
  • 异步执行
  • 响应执行

“Hello World!”

    下面是一个通过实现接口 HystrixCommand的一个Hello World 示例:   

public class HystrixHelloWorld extends HystrixCommand<String> {     private final String name;      public HystrixHelloWorld(String name) {         super(HystrixCommandGroupKey.Factory.asKey("ExampleGroup"));         this.name = name;     }      @Override     protected String run() {         return "Hello " + name + "!";     } }

   点击查看详细源码   

HystrixObservableCommand 等价于 HystrixCommand

    一个等效的Hello World解决方案,使用 HystrixObservableCommand 代替 HystrixCommand ,通过覆盖 construct 方法,如下所示:   

public class HystrixObservableHelloWorld extends HystrixObservableCommand<String> {     private final String name;      public HystrixObservableHelloWorld(String name) {         super(HystrixCommandGroupKey.Factory.asKey("ExampleGroup"));         this.name = name;     }      @Override     protected Observable<String> construct() {         return Observable.create(new Observable.OnSubscribe<String>() {             @Override             public void call(Subscriber<? super String> observer) {                 try {                     if (!observer.isUnsubscribed()) {                         // a real example would do work like a network call here                         observer.onNext("Hello");                         observer.onNext(name + "!");                         observer.onCompleted();                     }                 } catch (Exception e) {                     observer.onError(e);                 }             }         } ).subscribeOn(Schedulers.io());     } }

同步执行

    通过 execute() 方法同步调用 HystrixCommand 的实现,示例如下:

    

String s = new HystrixHelloWorld("World").execute();

单元测试如下:

@Test         public void testSynchronous() { //测试同步             assertEquals("Hello World!", new HystrixHelloWorld("World").execute());             assertEquals("Hello Bob!", new HystrixHelloWorld("Bob").execute());         }

关于实现了HystrixObservableCommand 的方法示例如下:

    关于HystrixObservableCommand 的实现没有简单的 execute 方法调用,如果清楚通过一个命令产生的 Observable 必定仅仅产生一个单一的值,则可以对 Observable 应用RXjava的操作 .toBlocking().toFuture().get() 模拟 execute 方法。

异步执行

    我们可以通过使用 queue() 方法异步执行 HystrixCommand ,示例如下: 

Future<String> fWorld = new HystrixHelloWorld("World").queue();

我们可以通过 Future获取到命令的结果集

String fw=fWorld.get();

通过单元测试模拟操作如下:

        @Test         public void testAsynchronous1() throws Exception { //测试异步             assertEquals("Hello World!", new HystrixHelloWorld("World").queue().get());             assertEquals("Hello Bob!", new HystrixHelloWorld("Bob").queue().get());         }          @Test         public void testAsynchronous2() throws Exception { //测试异步              Future<String> fWorld = new HystrixHelloWorld("World").queue();             Future<String> fBob = new HystrixHelloWorld("Bob").queue();              assertEquals("Hello World!", fWorld.get());             assertEquals("Hello Bob!", fBob.get());         }

下面的操作是等价的:

String s1 = new HystrixHelloWorld("World").execute(); String s2 = new HystrixHelloWorld("World").queue().get();

    关于实现了HystrixObservableCommand 的方法示例如下:

   HystrixObservableCommand没有 queue 这种简单实现异步的方法 ,如果清楚通过一个命令产生的 Observable 必定仅仅产生一个单一的值,则可以对 Observable 应用RxJava操作 .toBlocking().toFuture() 模拟 queue 方法。

响应执行

    可以通过一下任意方法监听 HystrixCommand 的结果:

  • observe() — 执行这个命令会返回一个热 Observable立刻执行hystrix的命令 ,因为这个 Observable 通过 ReplaySubject 过滤,咱们不会有丢失订阅之前的任何东西的危险。
  • toObservable() — 执行这个命令会返回一个“冷“ Observable,直到订阅 Observable 才会开始执行命令和发送结果 。
Observable<String> fWorld = new HystrixHelloWorld("World").observe();

执行完上面的代码,我们可以通过订阅 Observable 获取到它的值

fWorld.subscribe(new Action1<String>() {                 @Override                 public void call(String s) {                     // value emitted here                 }             });

下面的单元测试示例如下:

        @Test         public void testObservable() throws Exception {              Observable<String> fWorld = new HystrixHelloWorld("World").observe();             Observable<String> fBob = new HystrixHelloWorld("Bob").observe();              // blocking             assertEquals("Hello World!", fWorld.toBlocking().single());             assertEquals("Hello Bob!", fBob.toBlocking().single());              fWorld.subscribe(new Observer<String>() {                  @Override                 public void onCompleted() {                     // 这里可以什么都不做                 }                  @Override                 public void onError(Throwable e) {                     e.printStackTrace();                 }                  @Override                 public void onNext(String v) {                     System.out.println("onNext: " + v);                 }              });             fBob.subscribe(new Action1<String>() {                  @Override                 public void call(String v) {                     System.out.println("onNext: " + v);                 }              });         }

使用java8的 lambda 表达式,示例如下:

 fWorld.subscribe((v) -> {         System.out.println("onNext: " + v);     })          // - or while also including error handling          fWorld.subscribe((v) -> {         System.out.println("onNext: " + v);     }, (exception) -> {         exception.printStackTrace();     })

点击链接了解更多关于RXjava中 的 Observable

本文发表于2018年05月18日 10:00
(c)注:本文转载自https://my.oschina.net/u/2342969/blog/1814480,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如有侵权行为,请联系我们,我们会及时删除.

阅读 1957 讨论 0 喜欢 0

抢先体验

扫码体验
趣味小程序
文字表情生成器

闪念胶囊

你要过得好哇,这样我才能恨你啊,你要是过得不好,我都不知道该恨你还是拥抱你啊。

直抵黄龙府,与诸君痛饮尔。

那时陪伴我的人啊,你们如今在何方。

不出意外的话,我们再也不会见了,祝你前程似锦。

这世界真好,吃野东西也要留出这条命来看看

快捷链接
网站地图
提交友链
Copyright © 2016 - 2021 Cion.
All Rights Reserved.
京ICP备2021004668号-1