Chaining Observable&发送/传递原始发出以订阅呼叫

时间:2016-03-28 18:30:13

标签: java rx-java vertx3 vert.x

我有一个用例,我正在使用消息,保存消息然后回复成功或失败。 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"));
            });

上述代码是应该采用的方式还是有更好的方法?这两个订阅感觉不对。

1 个答案:

答案 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