1. 程式人生 > >hystrix文檔翻譯之如何使用

hystrix文檔翻譯之如何使用

如何 oob 處理 leg mman class a cte queue trac

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;
    }
    @Override
    
protected 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;
    public
CommandHelloWorld(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()); } }

同步執行

  使用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文檔翻譯之如何使用