文档章节

[Spring Cloud] 4.9 RxJava with Spring MVC

秋雨霏霏
 秋雨霏霏
发布于 2017/01/17 18:23
字数 388
阅读 894
收藏 10

4.9 RxJava with Spring MVC

Spring Cloud Netflix 包含了 RxJava

==RxJava 是Reactive Extensions实现的一个基于Java VM 的扩展包。一套基于可被观测发现的序列,来实现异步、事件模型的扩展类库==

Spring Cloud Netflix支持SpringMVC控制器中返回rx.Single。也支持使用rx.Observable对象来实现Server-sent events (SSE).如果你内部接口已经使用RxJava,那就更方便了。(Feign Hystrix Support

下面展示了,如何使用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,但不是单个的,那可以使用.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))));
}

© 著作权归作者所有

秋雨霏霏
粉丝 150
博文 95
码字总数 172605
作品 0
杭州
CTO(技术副总裁)
私信 提问
使用 Kotlin + WebFlux/RxJava 2 实现响应式以及尝试正式版本的协程

在前一篇文章《使用 Kotlin + Spring Boot 进行后端开发》中,曾介绍过尝试使用 Kotlin 来做后端开发。这一次,尝试 WebFlux 以及协程。 首先,在build.gradle中添加插件和依赖的库。 此次,...

fengzhizi715
2018/11/23
0
0
Spring XD 1.1 RC1 发布

Spring XD 1.1 RC1 发布,此版本现已提供下载,包括一些新特性和 bug 修复,主要是 Stream 处理。Spring XD 1.1. M2 中处理模块引入了对 Reactor 的 Stream API 的支持。在 1.1 RC1 支持使用...

oschina
2015/01/29
1K
4
熔断器 Hystrix 源码解析 —— 执行命令方式

摘要: 原创出处 www.iocoder.cn/Hystrix/com… 「芋道源码」欢迎转载,保留摘要,谢谢! 本文主要基于 Hystrix 1.5.X 版本 1. 概述 2. 实现 3. BlockingObservable 666. 彩蛋 🙂🙂🙂关...

Java公众号_芋道源码_每日更新
2018/10/28
0
0
《RxJava 2.x 实战》

我最近写了一本书《RxJava 2.x 实战》。 该书由电子工业出版社出版,目前已经在淘宝、京东、当当、亚马逊等各大电商平台上进行销售或预售。 天猫电子工业出版社旗舰店 https://detail.tmall...

fengzhizi715
2018/04/28
0
0
Flux 会取代 Web MVC,或可不再基于 Servlet 容器了?

对 Java 开发者来说,2017 年 9 月是个热闹的月份不但 Java SE 9、Java EE 8 相继发布,就连 Spring 框架,也在这段时间发布 5.0 正式版。 而新版 Spring 的一大特色,就是 Reactive Web 方案...

周其
2018/04/02
16.4K
22

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周六乱弹 —— 早上儿子问我他是怎么来的

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @凉小生 :#今日歌曲推荐# 少点戾气,愿你和这个世界温柔以待。中岛美嘉的单曲《僕が死のうと思ったのは (曾经我也想过一了百了)》 《僕が死の...

小小编辑
33分钟前
34
0
Excption与Error包结构,OOM 你遇到过哪些情况,SOF 你遇到过哪些情况

Throwable 是 Java 中所有错误与异常的超类,Throwable 包含两个子类,Error 与 Exception 。用于指示发生了异常情况。 Java 抛出的 Throwable 可以分成三种类型。 被检查异常(checked Exc...

Garphy
今天
9
0
计算机实现原理专题--二进制减法器(二)

在计算机实现原理专题--二进制减法器(一)中说明了基本原理,现准备说明如何来实现。 首先第一步255-b运算相当于对b进行按位取反,因此可将8个非门组成如下图的形式: 由于每次做减法时,我...

FAT_mt
昨天
6
0
好程序员大数据学习路线分享函数+map映射+元祖

好程序员大数据学习路线分享函数+map映射+元祖,大数据各个平台上的语言实现 hadoop 由java实现,2003年至今,三大块:数据处理,数据存储,数据计算 存储: hbase --> 数据成表 处理: hive --> 数...

好程序员官方
昨天
7
0
tabel 中含有复选框的列 数据理解

1、el-ui中实现某一列为复选框 实现多选非常简单: 手动添加一个el-table-column,设type属性为selction即可; 2、@selection-change事件:选项发生勾选状态变化时触发该事件 <el-table @sel...

everthing
昨天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部