在wab项目中学习rxjava

rxjava的教程在网上比较多了,但是大多数都是基于Android或者就是简单的main方法的方式教大家使用rxjava,缺少在web中使用rxjava的实例代码。我在初步使用中,问了几个同事才了解到如何在web项目中使用。这里就梳理下我的理解,有错误之处请大家支出,我会及时更正,让新入手的朋友可以快速上手。

一、项目介绍

web项目采用maven+spring mvc方式搭建,日志采用slf4j+log4j2实现,编辑器为idea,使用lombok插件(该插件eclipse应该也有,如果不使用,需要手写日志声明和getter、setter方法)。返回给前端的是json格式数据。项目地址:http://git.oschina.net/brendanv/rxjava
项目初期打算做三步部分,第一部分为rxjava的初识使用方法,直接按照Season的教程操作一遍,把结果在前端和日志里面输出,然后对比下两个结果是否一致。这部分代码主要放在first包里,一章对应一个controller,每个案例代码对应一个请求方法。第二部分是针对数据部分,采用mybatis框架,目前还在待定。第三部分是网络请求方面的,也待定。

二、啥也别说,先写两行代码

这部分就是根据Season的教程,来熟悉下rxjava。

第一章第一个案例

@RequestMapping("/case1")
    @ResponseBody
    public ResponseVO chapterOne1() {
        ResponseVO responseVO = new ResponseVO();
        Observable observable = Observable.create(new ObservableOnSubscribe() {
            @Override
            public void subscribe(ObservableEmitter emitter) throws Exception {
                emitter.onNext(1);
                emitter.onNext(2);
                emitter.onNext(3);
                emitter.onComplete();
            }
        });
        //创建一个下游 Observer
        Observer observer = new Observer() {
            @Override
            public void onSubscribe(Disposable d) {
                log.info("subscribe");
            }

            @Override
            public void onNext(Integer value) {
                log.info("" + value);
            }

            @Override
            public void onError(Throwable e) {
                log.info("error");
            }

            @Override
            public void onComplete() {
                log.info("complete");
            }
        };
        //建立连接
        observable.subscribe(observer);
        //blockingIterable转换Observable为其他对象的方法
        Iterable integers = observable.blockingIterable();
        responseVO.setData(integers);
        return responseVO;
    }

注意点:Season没有提到,不写complete()的情况,但是在我的试验中,如果web项目不写这个语句,会一直处于等待状态而不结束。具体实现细节待了解。blockingIterable转换Observable为其他对象的方法,rxjava2类似的还有blockingIterable blockingLatest blockingMostRecent blockingNext sorted to toFuture toList toMap toMultimap toSortedList

代码很简单,创建一个Observable,发送三个数字。使用observer接受数据,然后在日志里面输出;使用blockingInterable()来转换Observable里面的对象。具体的可以看Season里面的解释,很详细。

其中注意点为只有当上下游建立连接之后,上游才会发送事件。可以通过在Observer里面收到数据,又在blockingIterable里面获取数据来证明。

第一章第二个案例

第一个案例和第一个的主要区别就是采用了链式操作。代码见first.Chapter

第一章第三个案例

主要说明disposable的作用。针对Observer来说,可以切断和Observable的联系,但是对web的阻塞迭代器来说,没有作用。所以会发现Observable发送了三个数据,阻塞迭代器收到了三个,而Observer则接受了两个——肯定的啊,因为在Observer里面设置的切断啊。日志输出(即Observabe输出)

[rxjava-web]2017-07-21 15:37:05,072 INFO  [org.pengge.rxjava.web.controller.first.ChapterOneController:153] subscribe
[rxjava-web]2017-07-21 15:37:05,072 INFO  [org.pengge.rxjava.web.controller.first.ChapterOneController:135] emit 1
[rxjava-web]2017-07-21 15:37:05,073 INFO  [org.pengge.rxjava.web.controller.first.ChapterOneController:159] onNext: 1
[rxjava-web]2017-07-21 15:37:05,073 INFO  [org.pengge.rxjava.web.controller.first.ChapterOneController:137] emit 2
[rxjava-web]2017-07-21 15:37:05,074 INFO  [org.pengge.rxjava.web.controller.first.ChapterOneController:159] onNext: 2
[rxjava-web]2017-07-21 15:37:05,074 INFO  [org.pengge.rxjava.web.controller.first.ChapterOneController:162] dispose
[rxjava-web]2017-07-21 15:37:05,075 INFO  [org.pengge.rxjava.web.controller.first.ChapterOneController:164] isDisposed : true
[rxjava-web]2017-07-21 15:37:05,075 INFO  [org.pengge.rxjava.web.controller.first.ChapterOneController:139] emit 3
[rxjava-web]2017-07-21 15:37:05,076 INFO  [org.pengge.rxjava.web.controller.first.ChapterOneController:141] emit complete
[rxjava-web]2017-07-21 15:37:05,076 INFO  [org.pengge.rxjava.web.controller.first.ChapterOneController:143] emit 4
[rxjava-web]2017-07-21 15:37:05,086 INFO  [org.pengge.rxjava.web.controller.first.ChapterOneController:135] emit 1
[rxjava-web]2017-07-21 15:37:05,087 INFO  [org.pengge.rxjava.web.controller.first.ChapterOneController:137] emit 2
[rxjava-web]2017-07-21 15:37:05,087 INFO  [org.pengge.rxjava.web.controller.first.ChapterOneController:139] emit 3
[rxjava-web]2017-07-21 15:37:05,088 INFO  [org.pengge.rxjava.web.controller.first.ChapterOneController:141] emit complete
[rxjava-web]2017-07-21 15:37:05,088 INFO  [org.pengge.rxjava.web.controller.first.ChapterOneController:143] emit 4

web输出为:

{
    "code":200,
    "msg":"ok",
    "data":[
        1,
        2,
        3
    ]
}

你可能感兴趣的:(在wab项目中学习rxjava)