我正在考虑如何将RXJava用于下面描述的场景。
一个List<Object>
,每个对象都会被发送到k8s并检查状态,直到respone返回true,所以我的轮询活动就是:
private Observable<Boolean> startPolling(String content) {
log.info("start polling "+ content);
return Observable.interval(2, TimeUnit.SECONDS)
.take(3)
.observeOn(Schedulers.newThread())
.flatMap(aLong -> Observable.just(new CheckSvcStatus().check(content)))
.takeUntil(checkResult -> checkResult)
.timeout(3000L, TimeUnit.MILLISECONDS, Observable.just(false))
;
}
已发送行动的功能:
Observable<Compo> sentYamlAndGet() {
log.info("sent yaml");
sentYaml()
return Observable.just(content);
}
我尝试使用foreach
获取每个对象状态,如下所示:
public void rxInstall() throws JsonProcessingException {
List<Boolean>observables = Lists.newArrayList();
Observable.from(list)
.subscribeOn(Schedulers.newThread())
.concatMap(s -> sendYamlAndGet())
.timeout(3000l, TimeUnit.MILLISECONDS)
.subscribe()
;
Observable.from(list).forEach(s -> {
observables.add(Observable.just(s)
.flatMap(this::startPolling)
.toBlocking()
.last()
)
;
System.out.println(new ObjectMapper().writeValueAsString(observables));
}
输出列表的对象是:{"o1","o2","o3","o4","o5"}
我想要的最后一个客观状态是:[false,true,false,false,true]
。
以上风格并不多'ReactX',检查对象状态动作互不影响。
如何投掷foreach
?我试过toIterable()
,toList()
但失败了。
Observable.from(list)
.concatMap(s -> sentYamlAndGet())
.concatMap(this::startPolling)
....
;
想知道这样做是否是一种好习惯,最好的方法是什么?
提前致谢。
pps:currentlly我正在使用rxjava1
<version>1.2.0</version>
但可以更改为2('▽`)ノ