我有一个用例,我正在使用消息,保存消息然后回复成功或失败。 mongo插入返回一个Observable,因此我可以使用flatmap进行链接。问题是插入Observable会发出插入的结果,但是我需要从第一个observable发出的原始Message来回复。因此,为了使这项工作,我在第一个Observable的订阅内运行插入并在第二个订阅内回复。
我希望通过像flatmap这样的运算符以更具反应性的方式实现这一目标。我搜索了操作符列表,没有找到我正在寻找的东西。
eb.consumer("persister.save.event").toObservable()
.subscribe(msg -> {
mongo.insertObservable("event", (JsonObject) msg.body())
.subscribe(
res -> msg.reply(new JsonObject().put("success", true)),
error -> msg.fail(500, "failed to save event"));
});
上述代码是应该采用的方式还是有更好的方法?这两个订阅感觉不对。
答案 0 :(得分:2)
以下是避免两个订阅者可以采取的措施:
eb.consumer("persister.save.event").toObservable()
.flatMap(msg -> mongo.insertObservable("event", (JsonObject) msg.body()).map(mongoResponse -> msg))
.subscribe(
res -> msg.reply(new JsonObject().put("success", true)),
error -> msg.fail(500, "failed to save event"));
诀窍是map
你的mongo结果需要msg
内的flatMap
。