spring boot 项目中使用Rxjava2

什么是Rxjava?

来自百度百科的解释

RxJava - JVM响应式扩展Reactive Extensions 用于使用Java VM的可观察序列编写异步和基于事件的程序的库。

ReactiveX是一个通过使用可观察序列来编写异步和基于事件的程序的库。

它扩展了观察者模式以支持数据和/或事件序列,并增加了运算符,使您可以声明性地组合序列,同时抽象出对低级线程,同步,线程安全性,并发数据结构和非线程等事物的关注阻塞I / O。

在微服务中的优点

隔离每个服务,即使单个服务的响应失败了,也不会影响整个请求的响应。

上手使用

引入依赖

Rxjava 的版本:https://mvnrepository.com/artifact/io.reactivex.rxjava2/rxjava

本次采用最新的2.2.2版本


<dependency> <groupId>io.reactivex.rxjava2</groupId> <artifactId>rxjava</artifactId> <version>2.2.2</version> </dependency>

在spring boot中引入依赖后就可以使用Rxjava了,下面通过写一组hello world来看看Rxjava的基本原理。


import io.reactivex.Observable;
import io.reactivex.ObservableEmitter;
import io.reactivex.ObservableOnSubscribe;
import io.reactivex.annotations.NonNull;
import io.reactivex.functions.Consumer; public class Test {
public static void main(String[] args) {
//first
Observable.create(new ObservableOnSubscribe<String>() {
@Override
public void subscribe(@NonNull ObservableEmitter<String> observableEmitter) throws Exception {
observableEmitter.onNext("Hello World");
}
}).subscribe(new Consumer<String>() {
@Override
public void accept(String s) throws Exception {
System.out.println(s);
}
});
//second
System.out.println("------------------------------------");
Observable.just("hello world").subscribe(new Consumer<String>() {
@Override
public void accept(@NonNull String s) throws Exception {
System.out.println(s);
}
});
//third
System.out.println("------------------------------------");
Observable.just("hello world").subscribe(System.out :: println);
}
}

输出信息:

Rxjava 使用三步走

  • 创建被观察者(Observable)
  • 创建观察者(Observer)
  • 订阅(subscribe)

浅谈分析Rxjava中的被观察者,观察者

第一种写法通过create来创建一个观察者,而第二种第三种直接通过just方法来快速创建一个观察者

Observable.create(new ObservableOnSubscribe<String>() {})
Observable.just()

查看源码:

//create方法
public static <T> Observable<T> create(ObservableOnSubscribe<T> source) {
ObjectHelper.requireNonNull(source, "source is null");
return RxJavaPlugins.onAssembly(new ObservableCreate(source));
}
//just方法
public static <T> Observable<T> just(T item) {
ObjectHelper.requireNonNull(item, "The item is null");
return RxJavaPlugins.onAssembly(new ObservableJust(item));
}
显而易见两者方法最终的实现都是一样的,只不过是哪个写法更简洁点;本次只是入门级的了解,更深层次的源码研究放到之后。

从源码来看subscribe()方法,可以看出有多个重载方法。下面我们具体说下Observable相关的内容

上面的“hello world”案例是通过subscribe(Constumer<? super T> onNext)这个重载方法写的,下面是通过

subscribe(Consumer<? super T> onNext, Consumer<? super Throwable> onError, Action onComplete),

subscribe(Consumer<? super T> onNext, Consumer<? super Throwable> onError, Action onComplete, Consumer<? super Disposable>两种写法

subscribe(Consumer<? super T> onNext, Consumer<? super Throwable> onError, Action onComplete)方法:
Observable.just("hello world!")
.subscribe(new Consumer<String>() {
@Override
public void accept(String s) throws Exception {
//首先执行该方法,也就是onNext
System.out.println(s);
//当抛出异常时会走到onError方法,action方法不会再执行
//throw new Exception("error");
}
}, new Consumer<Throwable>() {
@Override
public void accept(Throwable throwable) throws Exception {
//当onNext发生异常时,此方法才会被执行
System.out.println(throwable.getMessage());
}
}, new Action() {
@Override
public void run() throws Exception {
//该方法是执行onNext之后执行的
System.out.println("onComplete");
}
}); subscribe(Consumer<? super T> onNext, Consumer<? super Throwable> onError, Action onComplete, Consumer<? super Disposable>方法
Observable.just("hello world!")
.subscribe(new Consumer<String>() {
@Override
public void accept(String s) throws Exception {
System.out.println(s);
}
}, new Consumer<Throwable>() {
@Override
public void accept(Throwable throwable) throws Exception {
System.out.println(throwable.getMessage());
}
}, new Action() {
@Override
public void run() throws Exception {
System.out.println("onComplete");
}
}, new Consumer<Disposable>() {
@Override
public void accept(Disposable disposable) throws Exception {
System.out.println("onSubscribe");
}
});
打印结果:
onSubscribe
hello world !
onComplete

因为我们使用的Rxjava2的版本,所以我们需要使用Observer作为观察对象,我们针对上面的写法,再次优化

Observable.just("hello world!")
.subscribe(new Observer<String>() {
@Override
public void onSubscribe(@NonNull Disposable disposable) {
System.out.println("onSubscribe");
} @Override
public void onNext(@NonNull String s) {
System.out.println("onNext");
} @Override
public void onError(@NonNull Throwable throwable) {
System.out.println("onError");
} @Override
public void onComplete() {
System.out.println("onComplete");
}
});
打印信息:
onSubscribe
onNext - > hello world!
onComplete

所以,通过上面的几种“hello world”的写法,我们知道被观察者,观察者,subscribe()三者缺一不可,

只有使用了订阅(也就是subscribe()方法),被观察才会发送数据

~~~~~~~Rxjava入门继续学习中~~~~~~~~

写个hello world了解Rxjava的更多相关文章

  1. RxJava 和 RxAndroid 四(RxBinding的使用)

    对Rxjava不熟悉的同学可以先看我之前写的几篇文章 RxJava 和 RxAndroid 一 (基础) RxJava 和 RxAndroid 二(操作符的使用) RxJava 和 RxAndroid ...

  2. RxJava 2.x 使用最佳实践

    转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/76443347 本文出自[赵彦军的博客] 以前写过 Rxjava 系列教程, 如下所 ...

  3. Android Weekly Notes Issue #232

    Android Weekly Issue #232 November 20th, 2016 Android Weekly Issue #232 本期内容包括: Kotlin的优势讨论; MVVM模式结 ...

  4. Java的演化-Java8实战笔记

    一个语言要想一直有活力,它也需要跟随着时代的变化去进步,Java作为一个古老的语言,它其实有太多的历史包袱,在改变的过程中需要考虑很多,但是它也在慢慢的演变,巩固自己的城墙,不让自己被遗忘在历史中(不 ...

  5. 2018年Android面试题含答案--适合中高级(下)

    这里是我整理出来的面试题,答案我花了很久的时间.加上我自己的理解整理出来的,作者不易,请谅解.有答案的的:https://xiaozhuanlan.com/topic/6132940875   1.A ...

  6. 2016 Top 10 Android Library

    过去的 2016 年,开源社区异常活跃,很多个人与公司争相开源自己的项目,让人眼花缭乱,然而有些项目只是昙花一现,有些项目却持久创造价值,为开发者提供了极大的便利,这些终究由时间来判断.今天,我就来整 ...

  7. 2018年Android面试题含答案--适合中高级(下)(转)

    这里是我整理出来的 面试题,答案我花了很久的时间.加上我自己的理解整理出来的,作者不易,请谅解.有答案的的:https://xiaozhuanlan.com/topic/6132940875   1. ...

  8. Android消息传递之基于RxJava实现一个EventBus - RxBus

    前言: 上篇文章学习了Android事件总线管理开源框架EventBus,EventBus的出现大大降低了开发成本以及开发难度,今天我们就利用目前大红大紫的RxJava来实现一下类似EventBus事 ...

  9. 【知识必备】RxJava+Retrofit二次封装最佳结合体验,打造懒人封装框架~

    一.写在前面 相信各位看官对retrofit和rxjava已经耳熟能详了,最近一直在学习retrofit+rxjava的各种封装姿势,也结合自己的理解,一步一步的做起来. 骚年,如果你还没有掌握ret ...

随机推荐

  1. MFC调试时可以,使用生产的exe时,显示未响应解决方案

    首先,使用release模式,生成解决方案和exe. 对生成的exe,选择属性,兼容性,win7,应用,即可解决. 此方法对debug无用

  2. PAT 1001 A+B 解题报告

    PAT 1001 A+B 代码链接:传送门 题目链接:传送门 题目简述: 给定两个值a,b: 范围-1000000 <= a, b <= 1000000: 按指定格式输出a+b的结果,例: ...

  3. CI 2.2 + smarty 3.1.18 完美整合配置成功

    CI 2.2 + smarty 3.1.18 配置成功 一.准备文档下载  (CI 框架和smarty) 二.将Smarty-3.1.18 源码包里面的libs文件夹copy到ci的项目目录appli ...

  4. python第一课——关于python的一些概念

    day01(上午): 1.学习方法(建议): 1).不要依赖于我的视频,绝对不要晚上将视频全部在过一遍 2).上课不要记笔记,而且不要用纸质的笔记本去整理笔记 3).不要只看不敲,代码方面我们需要做到 ...

  5. HDU5343:MZL's Circle Zhou(SAM,记忆化搜索DP)

    Description Input Output Sample Input Sample Output Solution 题意:给你两个串,分别从两个里面各选出一个子串拼到一起,问能构成多少个本质不同 ...

  6. [JLOI2009]二叉树问题

    嘟嘟嘟 对于求深度和宽度都很好维护.深度dfs时维护就行,宽度统计同一个深度的节点有多少个,然后取max. 对于求距离,我刚开始以为是要走到根节点在回来,然后固输了(dep[u] - 1) * 2 + ...

  7. 703. Kth Largest Element in a Stream

    题目来源: https://leetcode.com/problems/kth-largest-element-in-a-stream/ 自我感觉难度/真实难度: 题意: 这个题目的意思解读了半天,没 ...

  8. BI之报表测试总结

    报表测试总结: 1.测试准备工作: 数据准备 保证足够多的有效数据 清楚报表中涉及到的算法.公式 清楚业务功能接口 2.报表测试点 基本测试点:界面.控件.格式.布局.明显的数据错误.js报错.报表标 ...

  9. P2008 大朋友的数字

    题目描述 有一批大朋友(年龄15岁以上),他们每人手上拿着一个数字,当然这个数字只有1位,也就是0到9之间.每个大朋友的分数为在他之前的最长不下降子序列中所有数之和.(这个序列必须以它作为结尾!)如有 ...

  10. 【原型图】Mockplus

    Mockplus   原型设计工具