RxJava:链异步回调式Web服务

时间:2017-01-18 12:53:14

标签: rx-java rx-java2

我有一些从硬件设备连续发出的数据。首先需要将此数据连续发送到Web服务A,如果有足够的数据到达,则会在一段时间后返回结果流。然后,每当结果到达web服务B时,​​必须转发每个结果,如果来自A的足够结果,则在一段时间之后返回不同结果的流。每个Web服务都有一个异步回调式API。在第一次向每个Web服务发送数据之前,还需要进行一些连接设置。

如何将此映射到RxJava?

1 个答案:

答案 0 :(得分:2)

flatMapconcatMap是异步链接的主要工具。

您需要将您的网络服务包装到Future中。并将您的硬件设备转换为Observable来源。然后它就像:

一样简单
class WebServices {
    Future<Response1> callService1(parameters) { ... }
    Future<Response2> callService2(parameters) { ... }
}

hardwareSource
    .flatMap(v -> Observable.fromFuture(callService1(...)))
    .flatMap(r1 -> Observable.fromFuture(callService2(...)))
    .subscribe(r2 -> System.out.println(r2));

如果webservices接收并发送系列消息,则应将其包装到Observable中。处理管道看起来像:

class WebServices {
    Observable<Response1> sendToService1(parameters) { ... }
    Observable<Response2> sendToService2(parameters) { ... }
}

hardwareSource
    .flatMap(v -> sendToService1(...))
    .flatMap(r1 -> sendToService2(...))
    .subscribe(r2 -> System.out.println(r2));

如果webservices的传入和传出流没有严格关联(响应与请求没有直接关联),那么我会将这些服务实现为暴露ObserverObservable接口的类。

// wire them up
hardwareSource.getObservable()
    .subscribe(webService1.getObserver());
webService1.getObservable()
    .subscribe(webService2.getObserver());
webService2.getObservable()
    .subscribe(resultHandler);

// initiate connections
webService2.connect()
webService1.connect()
hardwareSource.connect()