Тест до успеха, используя rxjava2 - PullRequest
0 голосов
/ 12 января 2019

Как правильно выполнить приведенные ниже тесты с использованием rxjava2?

Имея список серверов ntp, тестируйте каждый из них, пока не добьетесь успеха.

Пример:

  • time.nist.gov -> тайм-аут
  • pool.ntp.org -> время ожидания
  • time.google.com -> успех, дата получения
  • time.apple.com -> игнорировать

Я не хочу проверять все в параллелях, но по одному. И если все не удается, он снова запускает тест.

Используя только один сервер, я использую следующий код:

public void getTime() {
    timeObservable = Observable
            .fromCallable(new Callable<Date>() {
                @Override
                public Date call() throws IOException {
                    return connectAndGetTime(HOST);
                }
            })
            .subscribeOn(Schedulers.newThread())
            .observeOn(AndroidSchedulers.mainThread())
            .doOnError(new Consumer<Throwable>() {
                @Override
                public void accept(Throwable error) {
                    Timber.tag(TAG).e(error);
                }
            })
            .retry(5);

    timeObservable.subscribe(new Consumer<Date>() {
        @Override
        public void accept(Date date) {
            mDate = date;
        }
    }, new Consumer<Throwable>() {
        @Override
        public void accept(Throwable throwable) {
            Timber.tag(TAG).e(throwable);
        }
    });
}

Спасибо!

1 Ответ

0 голосов
/ 14 января 2019

Спасибо, Алексей, ты прав. Зачем все усложнять?

Конечный результат выглядит так:

public void getTime() {
    timeObservable = Observable
            .fromCallable(new Callable<Date>() {
                @Override
                public Date call() {
                    for (String host : Arrays.asList("time.google.com", "time.apple.com", "time.nist.gov")) {
                        try {
                            return connectAndGetTime(host);
                        } catch (Exception e) {
                            Timber.tag(TAG).d("Sync (%s) fail!", host);
                        }
                    }
                    return null;
                }
            })
            .subscribeOn(Schedulers.newThread())
            .observeOn(AndroidSchedulers.mainThread())
            .doOnError(new Consumer<Throwable>() {
                @Override
                public void accept(Throwable error) {
                    Timber.tag(TAG).e(error);
                }
            })
            .retry(5);

    timeObservable.subscribe(new Consumer<Date>() {
        @Override
        public void accept(Date date) {
            mDate = date;
        }
    }, new Consumer<Throwable>() {
        @Override
        public void accept(Throwable throwable) {
            Timber.tag(TAG).e(throwable);
        }
    });
}
...