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<Integer> observable = Observable.create(new ObservableOnSubscribe<Integer>() {
@Override
public void subscribe(ObservableEmitter<Integer> emitter) throws Exception {
emitter.onNext(1);
emitter.onNext(2);
emitter.onNext(3);
emitter.onComplete();
}
});
//创建一个下游 Observer
Observer<Integer> observer = new Observer<Integer>() {
@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<Integer> 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
]
}
网友评论