RxJava 和 Spring MVC (译)

来源:互联网 发布:小七网络毛毯中学 编辑:程序博客网 时间:2024/06/04 18:48

RxJava with Spring MVC

Spring Cloud Netflix引入了Rxjava

RxJava是一个Reactive Extensions的Java VM实现:它是一个使用可观察数据流进行异步编程的编程接口,ReactiveX结合了观察者模式、迭代器模式和函数式编程的精华,与异步数据流交互的编程范式。

Spring Cloud Netflix提供并支持从Spring MVC Controllers返回rx.Single对象. 它还支持使用 rx.Observable 对象,可观察的对象为 Server-sent events (SSE). 如果你的内部api已经使用RxJava这会非常的方便(可以查看spring-cloud-feign-hystrix为例)。

这里有一些使用rx.Single的列子:

@RequestMapping(method = RequestMethod.GET, value = "/single")public Single<String> single() {    return Single.just("single value");}@RequestMapping(method = RequestMethod.GET, value = "/singleWithResponse")public ResponseEntity<Single<String>> singleWithResponse() {    return new ResponseEntity<>(Single.just("single value"),            HttpStatus.NOT_FOUND);}@RequestMapping(method = RequestMethod.GET, value = "/singleCreatedWithResponse")public Single<ResponseEntity<String>> singleOuterWithResponse() {    return Single.just(new ResponseEntity<>("single value", HttpStatus.CREATED));}@RequestMapping(method = RequestMethod.GET, value = "/throw")public Single<Object> error() {    return Single.error(new RuntimeException("Unexpected"));}

如果你使用 Observable, 而不Single, 你可以使用.toSingle() 或 .toList().toSingle(). 下面是些例子:

@RequestMapping(method = RequestMethod.GET, value = "/single")public Single<String> single() {    return Observable.just("single value").toSingle();}@RequestMapping(method = RequestMethod.GET, value = "/multiple")public Single<List<String>> multiple() {    return Observable.just("multiple", "values").toList().toSingle();}@RequestMapping(method = RequestMethod.GET, value = "/responseWithObservable")public ResponseEntity<Single<String>> responseWithObservable() {    Observable<String> observable = Observable.just("single value");    HttpHeaders headers = new HttpHeaders();    headers.setContentType(APPLICATION_JSON_UTF8);    return new ResponseEntity<>(observable.toSingle(), headers, HttpStatus.CREATED);}@RequestMapping(method = RequestMethod.GET, value = "/timeout")public Observable<String> timeout() {    return Observable.timer(1, TimeUnit.MINUTES).map(new Func1<Long, String>() {        @Override        public String call(Long aLong) {            return "single value";        }    });}

如果你有一个流端点和客户端,SSE可能是一个选项。使用 RxResponse.sse()将rx.Observable转换到Spring 的SseEmitter. 以下是一些例子:

@RequestMapping(method = RequestMethod.GET, value = "/sse")public SseEmitter single() {    return RxResponse.sse(Observable.just("single value"));}@RequestMapping(method = RequestMethod.GET, value = "/messages")public SseEmitter messages() {    return RxResponse.sse(Observable.just("message 1", "message 2", "message 3"));}@RequestMapping(method = RequestMethod.GET, value = "/events")public SseEmitter event() {    return RxResponse.sse(APPLICATION_JSON_UTF8,            Observable.just(new EventDto("Spring io", getDate(2016, 5, 19)),                    new EventDto("SpringOnePlatform", getDate(2016, 8, 1))));}
0 0
原创粉丝点击