【发布时间】:2015-06-05 17:01:55
【问题描述】:
我正在尝试创建一个任务,该任务将定期查询我的数据库,将所有结果写入其他状态,我想使用 RxJava 来执行此操作。
我正在使用RxJava-JDBC 来查询我的数据库。代码如下所示:
final Database db = Database.from(url);
db
.select("SELECT f1,f2 FROM mydata")
.autoMap(MyDatum.class)
.subscribe(
new Action1<MyDatum>() {
@Override
public void call(MyDatum t) {
state.add(t);
}
},
new Action1<Throwable>() {
@Override
public void call(Throwable t) {
L.error("Task failed", t);
}
},
new Action0() {
@Override
public void call() {
state.makeAvailable();
}
}
);
问题是,当我订阅时它会起作用,然后它就会停止。所以我使用了Observable.interval 并且有这个工作:
Observable
.interval(10, TimeUnit.SECONDS)
.forEach(
new Action1<Long>() {
@Override
public void call(Long arg) {
db
.select("SELECT f1,f2 FROM mydata")
.autoMap(MyDatum.class)
.subscribe(
new Action1<MyDatum>() {
@Override
public void call(MyDatum t) {
state.add(t);
}
},
new Action1<Throwable>() {
@Override
public void call(Throwable t) {
L.error("Task failed", t);
}
},
new Action0() {
@Override
public void call() {
state.makeAvailable();
}
}
);
}
}
);
但我想知道如果我没有做错什么让一个流嵌套在另一个流中。
我考虑过使用flatMap,但是onComplete 永远不会被执行,因为interval 永远不会调用onComplete。
我希望它不仅可以通过间隔触发,还可以通过传入事件触发。
我在这里遗漏了什么吗? 谢谢
【问题讨论】:
-
doOnNext和doOnCompleted运算符在您的情况下非常有用。这是一个示例,您可以如何使用这些运算符实现所描述的行为 gist.github.com/nsk-mironov/087bbe570a617d366260 -
您使用的
interval方法有一个怪癖。它只会在 x timeunit 过去后启动。我建议立即使用timer(0, 10, TimeUnit.SECONDS)。见Github PR。 -
@VladimirMironov 谢谢,这看起来确实比我做的要好一些。你介意提出这个作为答案吗?
标签: reactive-programming rx-java