Тестируйте до успеха, используя rxjava2

Как правильно реализовать приведенные ниже тесты с помощью 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);
        }
    });
}

Спасибо!

Я думаю, что, поскольку вы хотите последовательно пробовать разные хосты, вам вообще не нужно использовать rxJava. Просто напишите цикл с несколькими connectAndGetTime () внутри.

Alexei Kaigorodov 12.01.2019 12:06
0
1
41
1

Ответы 1

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

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

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);
        }
    });
}

Другие вопросы по теме