hystrix文檔翻譯之如何使用
Hello World!
使用HystrixCommand實現“Hello World”。
public class CommandHelloWorld extends HystrixCommand<String> { private final String name; public CommandHelloWorld(String name) { super(HystrixCommandGroupKey.Factory.asKey("ExampleGroup")); this.name = name; } @Overrideprotected String run() { // a real example would do work like a network call here return "Hello " + name + "!"; } }
使用HystrixObservableCommand實現“Hello World”。
public class CommandHelloWorld extends HystrixObservableCommand<String> { private final String name; publicCommandHelloWorld(String name) { super(HystrixCommandGroupKey.Factory.asKey("ExampleGroup")); this.name = name; } @Override protected Observable<String> construct() { return Observable.create(new Observable.OnSubscribe<String>() { @Overridepublic 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()); } }
同步執行
使用HystrixCommand的execute方法同步執行。
String s = new CommandHelloWorld("World").execute();
HystrixObservableCommand沒有execute方法,但如果你確定Observable只會返回一個單一結果,你可以使用.toBlocking().toFuture().get()方法。
異步執行
使用HystrixCommand的queue()方法實現異步:
Future<String> fs = new CommandHelloWorld("World").queue();
通過get方式獲得結果
String s = fs.get();
HystrixObservableCommand沒有queue方法,但如果你確定Observable只會返回一個單一結果,你可以使用.toBlocking().toFuture()方法。
響應執行
通過下面兩個方法可以獲取Observable對象。
- observe,返回一個Observable並且立即執行命令,因為observe方法內部使用了一個RepaySubject,所以也會接受到監聽以前命令返回的結果。
- toObservable,返回一個Observable但不回立即執行,當監聽該對象時才執行。
Observable<String> ho = new CommandHelloWorld("World").observe(); // or Observable<String> co = new CommandHelloWorld("World").toObservable(); ho.subscribe(new Action1<String>() { @Override public void call(String s) { // value emitted here } });
使用單元測試執行
@Test public void testObservable() throws Exception { Observable<String> fWorld = new CommandHelloWorld("World").observe(); Observable<String> fBob = new CommandHelloWorld("Bob").observe(); // blocking assertEquals("Hello World!", fWorld.toBlockingObservable().single()); assertEquals("Hello Bob!", fBob.toBlockingObservable().single()); // non-blocking // - this is a verbose anonymous inner-class approach and doesn‘t do assertions fWorld.subscribe(new Observer<String>() { @Override public void onCompleted() { // nothing needed here } @Override public void onError(Throwable e) { e.printStackTrace(); } @Override public void onNext(String v) { System.out.println("onNext: " + v); } }); // non-blocking // - also verbose anonymous inner-class // - ignore errors and onCompleted signal fBob.subscribe(new Action1<String>() { @Override public void call(String v) { System.out.println("onNext: " + v); } }); }
響應式命令
除了使用上面的方式來獲取Observable對象,還可以通過HystrixObservableCommand來創建一個Observable對象。HystrixObservableCommand可以創建一個返回多個值的Observable對象。HystrixObservableCommand使用consruct方法來執行命令而不是run方法。通過一下兩種方式來獲取Observable對象:
- observe,返回一個Observable並且立即執行命令,因為observe方法內部使用了一個RepaySubject,所以也會接受到監聽以前命令返回的結果。
- toObservable,返回一個Observable但不回立即執行,當監聽該對象時才執行。
降級
通過添加fallback方法可以讓命令執行異常時執行降級措施。你會為大多數的hystrix 命令實現降級方法,除了一下的情況:
- 命令執行寫操作
如果hystrix命令是被設計成一個寫操作而非讀操作(HystrixCommand命令返回void或者HystrixObservableCommand返回一個空的Observable對象)。那麽沒有什麽實現fallback方法。如果寫出錯了,應該把異常拋出給調用方。
- 執行批量計算
如果hystrix命令使用了緩存、或者批量、或者離線技術,也應該把異常拋給調用方,讓調用放過處理而不是降級。
無論你的命令是否有fallback,hystrix狀態和熔斷器狀態都會更新。
hystrix文檔翻譯之如何使用