冷热rx-java可观察

我自己对“热的和冷的可观察的”的理解是不稳定的,但这是我到目前为止所了解的!

冷观测

考虑一个返回rx-java Observable的API:

import obs.Util;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import rx.Observable;
import rx.schedulers.Schedulers;public class Service1 {private static final Logger logger = LoggerFactory.getLogger(Service1.class);public Observable<String> operation() {return Observable.<String>create(s -> {logger.info("Start: Executing slow task in Service 1");Util.delay(1000);s.onNext("data 1");logger.info("End: Executing slow task in Service 1");s.onCompleted();}).subscribeOn(Schedulers.computation());}
}

现在,首先要注意的是,典型的Observable在订阅之前不会做任何事情:

所以基本上,如果我要这样做:

Observable<String> op1 = service1.operation();

除非通过以下方式在Observable上进行订阅,否则不会打印或返回任何内容:

Observable<String> op1 = service1.operation();CountDownLatch latch = new CountDownLatch(1);op1.subscribe(s -> logger.info("From Subscriber 1: {}", s),e -> logger.error(e.getMessage(), e),() -> latch.countDown());latch.await();

因此,现在,如果此Observable上有多个订阅,将会发生什么:

Observable<String> op1 = service1.operation();CountDownLatch latch = new CountDownLatch(3);op1.subscribe(s -> logger.info("From Subscriber 1: {}", s),e -> logger.error(e.getMessage(), e),() -> latch.countDown());op1.subscribe(s -> logger.info("From Subscriber 2: {}", s),e -> logger.error(e.getMessage(), e),() -> latch.countDown());op1.subscribe(s -> logger.info("From Subscriber 3: {}", s),e -> logger.error(e.getMessage(), e),() -> latch.countDown());latch.await();

有了冷的可观察到的代码,代码将再次被调用并再次发出项目,我在机器上得到了这个代码:

06:04:07.206 [RxComputationThreadPool-2] INFO  o.b.Service1 - Start: Executing slow task in Service 1
06:04:07.208 [RxComputationThreadPool-3] INFO  o.b.Service1 - Start: Executing slow task in Service 1
06:04:08.211 [RxComputationThreadPool-2] INFO  o.b.BasicObservablesTest - From Subscriber 2: data 1
06:04:08.211 [RxComputationThreadPool-1] INFO  o.b.BasicObservablesTest - From Subscriber 1: data 1
06:04:08.211 [RxComputationThreadPool-3] INFO  o.b.BasicObservablesTest - From Subscriber 3: data 1
06:04:08.213 [RxComputationThreadPool-2] INFO  o.b.Service1 - End: Executing slow task in Service 1
06:04:08.214 [RxComputationThreadPool-1] INFO  o.b.Service1 - End: Executing slow task in Service 1
06:04:08.214 [RxComputationThreadPool-3] INFO  o.b.Service1 - End: Executing slow task in Service 1

热可观察–使用ConnectableObservable

另一方面,Hot Observable确实不需要订阅即可开始发射项目。 一种实现Hot Observable的方法是使用ConnectableObservable ,它是一个Observable,它在调用connect方法之前不会发出项目,但是一旦开始发出项目,它的任何订阅者只能从订阅点获取项目。 因此,再次回顾前面的示例,但使用ConnectableObservable代替:

Observable<String> op1 = service1.operation();ConnectableObservable<String> connectableObservable =  op1.publish();CountDownLatch latch = new CountDownLatch(3);connectableObservable.subscribe(s -> logger.info("From Subscriber 1: {}", s),e -> logger.error(e.getMessage(), e),() -> latch.countDown());connectableObservable.subscribe(s -> logger.info("From Subscriber 2: {}", s),e -> logger.error(e.getMessage(), e),() -> latch.countDown());connectableObservable.subscribe(s -> logger.info("From Subscriber 3: {}", s),e -> logger.error(e.getMessage(), e),() -> latch.countDown());connectableObservable.connect();latch.await();

并打印以下内容:

06:07:23.852 [RxComputationThreadPool-3] INFO  o.b.Service1 - Start: Executing slow task in Service 1
06:07:24.860 [RxComputationThreadPool-3] INFO  o.b.ConnectableObservablesTest - From Subscriber 1: data 1
06:07:24.862 [RxComputationThreadPool-3] INFO  o.b.ConnectableObservablesTest - From Subscriber 2: data 1
06:07:24.862 [RxComputationThreadPool-3] INFO  o.b.ConnectableObservablesTest - From Subscriber 3: data 1
06:07:24.862 [RxComputationThreadPool-3] INFO  o.b.Service1 - End: Executing slow task in Service 1

热点可观察–使用主题

将冷的Observable转换为热的另一种方法是使用Subject 。 主题既表现为可观察者,又表现为观察者,有不同类型的主题具有不同的行为。 在这里,我使用一个名为PublishSubject的Subject,它具有Pub / Sub行为–这些项目被发送给所有在其上监听的订阅者。 因此,随着PublishSubject的引入,代码如下所示:

Observable<String> op1 = service1.operation();PublishSubject<String> publishSubject = PublishSubject.create();op1.subscribe(publishSubject);CountDownLatch latch = new CountDownLatch(3);publishSubject.subscribe(s -> logger.info("From Subscriber 1: {}", s),e -> logger.error(e.getMessage(), e),() -> latch.countDown());publishSubject.subscribe(s -> logger.info("From Subscriber 2: {}", s),e -> logger.error(e.getMessage(), e),() -> latch.countDown());publishSubject.subscribe(s -> logger.info("From Subscriber 3: {}", s),e -> logger.error(e.getMessage(), e),() -> latch.countDown());latch.await();

了解如何将PublishSubject作为Observable的订阅者引入,而其他订阅者如何订阅PublishSubject。 输出将类似于ConnectableObservable的输出。

从本质上来说,这就是我对“热可观察”的理解程度。 因此,总而言之,Cold和Hot Observable之间的区别在于订户何时获得发射的项目以及何时发射项目–使用Cold Observable,它们在订阅并通常获得所有发射的项目时发射,一个Hot Observable,项目将在没有订阅服务器的情况下发出,而订阅者通常会在订阅点之后获得项目。

参考

  1. http://www.introtorx.com/content/v1.0.10621.0/14_HotAndColdObservables.html
  2. Rx-java上的优秀Javadoc – http://reactivex.io/RxJava/javadoc/index.html

翻译自: https://www.javacodegeeks.com/2015/03/hot-and-cold-rx-java-observable.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/360318.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

布尔表达式的语法及语义分析程序_XSS语义分析的阶段性总结(一)

作者&#xff1a;Kale 合天智汇前言由于X3Scan的研发已经有些进展了&#xff0c;所以对这一阶段的工作做一下总结&#xff01;对于X3Scan的定位&#xff0c;我更加倾向于主动被动的结合。主动的方面主要体现在可以主动抓取页面链接并发起请求&#xff0c;并且后期可能参考XSStr…

计算机上的usb设备是什么东西,联接一个USB的线在电脑桌上方便插U盘的东西叫什么?...

HUB&#xff0c;即俗称的集线器。它是一个多端口的转发器&#xff0c;当以HUB为中心设备时&#xff0c;网络中某条线路产生了故障&#xff0c;并不影响其它线路的工作。所以HUB在局域网中得到了广泛的应用。大多数的时候它用在星型与树型网络拓扑结构中&#xff0c;以RJ45接口与…

【黑金原创教程】【TimeQuest】【第二章】TimeQuest模型角色,网表概念,时序报告...

声明&#xff1a;本文为黑金动力社区&#xff08;http://www.heijin.org&#xff09;原创教程&#xff0c;如需转载请注明出处&#xff0c;谢谢&#xff01; 黑金动力社区2013年原创教程连载计划&#xff1a; http://www.cnblogs.com/alinx/p/3362790.html 《FPGA那些事儿--Tim…

设置springboot日志级别_Spring Boot 日志框架实践

概述Java应用中&#xff0c;日志一般分为以下5个级别&#xff1a;ERROR 错误信息WARN 警告信息INFO 一般信息DEBUG 调试信息TRACE 跟踪信息Spring Boot使用Apache的Commons Logging作为内部的日志框架&#xff0c;其仅仅是一个日志接口&#xff0c;在实际应用中需要为该接口来指…

简单的类来测量延迟

这是我编写的用于测量延迟的非常简单的类。 HDRHistogram并不是劳斯莱斯解决方案&#xff0c;但是如果您只想向项目添加一个类&#xff0c;则可以很好地解决问题。 这是一个简单的测试程序&#xff0c;向您展示其用法&#xff1a; package util;public class LatencyMeasureE…

计算机加分乘法套用,8+8+8+8+8写成乘法算式要怎样写?小学数学为何这么死板?...

88888写成乘法算式只能写8x5不能写5x8吗&#xff1f;小学数学为何这么死板&#xff1f;这个题目来自于某小学的期考试卷&#xff0c;是个填空题&#xff0c;88888写成乘法算式时给了两个空( )和( )&#xff0c;就有人提出来只能写8x5不能写5x8&#xff0c;所以应该只给一个空。…

债券价格和通胀率

一般规律&#xff0c;通胀率于债券收益率正相关。 当通胀率较高时&#xff0c;市场会降低对债券的需求&#xff08;固定息票&#xff09; 》 导致债券价格下跌&#xff0c;收益率上升。转载于:https://www.cnblogs.com/xispace/p/3383357.html

净值:测试编码器/解码器

我最近与Netty进行了一些合作&#xff0c;并且按照此出色的教程中的说明构建了编码器/解码器管道&#xff0c;以测试编码器和解码器是否在正常工作而不必发送真实的消息。 幸运的是&#xff0c;有一个EmbeddedChannel确实使我们的生活变得非常轻松。 假设我们有一条消息“ Fo…

投影元素直接隔离_摸着夜色上露台开投影,是巴塞罗那设计师的浪漫

总有人说&#xff0c;世界为你关上一扇门&#xff0c;定会为你留有一扇窗。在家闷上个把月&#xff0c;窗户直接担起了连接人们与外界的通道。既然观众出不了门&#xff0c;那不如让加油打气的海报们&#xff0c;自己爬上墙好了——人们打开窗子就能撞上。平面设计师Ral Goi一直…

天涯明月刀7月4号服务器维护,7月8日服务器例行维护公告

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼亲爱的玩家&#xff1a;青龙乱舞区、大地飞鹰区、沧海云帆区、把酒邀月区、边城浪子区全部服务器将在7月8日6:00~10:00停机维护更新&#xff0c;&#xff0c;维护完成后上述各服务器客户端版本更新至2.1.20.23&#xff0c;给您带来…

关于ecshop中jquery与js冲突解决的方案

ECShop把AJAX事件和JSON解析的模块放在common/transport.js之中&#xff0c;可以说它也有自己封装的一套工具&#xff0c;这其实是很正常的。但恰恰的&#xff0c;在封装JSON各种方法的同时对object的模型进行了重写&#xff0c;这个就跟jQuery冲突了。因为众所周知的&#xff…

Apache Lucene的结构

不可估量的高贵的Apache软件基金会&#xff08;Apache Software Foundation&#xff09;产生了许多重要产品&#xff08;Ant&#xff0c;CouchDB&#xff0c;Hadoop&#xff0c;JMeter&#xff0c;Maven&#xff0c;OpenOffice&#xff0c;Subversion等&#xff09;&#xff0c…

comcerter无法识别串口_基于FPGA 的MXN维字符识别的实现

基于FPGA 的MXN维字符识别的实现1 概述本文的灵感来源于杨淑英老师的一张PPT&#xff08;手写数字识别&#xff09;&#xff0c;在此特别鸣谢杨淑英老师。一般机器视觉对事物是没有感知的&#xff0c;比如摄像头采集到一张苹果的图片&#xff0c;它本身是不知道那是什么东西&am…

嵌套的json ajax,通过jquery或javascript通过AJAX读取嵌套的JSON并输出到表中

我真的很想有一个快速便捷的方法来遍历JSON中的多个记录&#xff0c;每个记录都有潜在的深层嵌套。我只想输出到表。我不确定$ .each()或$ .ajax()成功的javascript方法需要通过function()传递哪些参数。所有示例似乎都使用通用词“data”或“ obj”&#xff0c;但它们使我感到…

难题:嵌套computeIfAbsent

总览 Java 8库在地图上有一个新方法&#xff0c;computeIfAbsent。 这是一种非常有用的将地图变成与键关联的对象的缓存的方法。 但是&#xff0c;您可能没有考虑过一种组合。 如果您在内部调用computeIfAbsent会发生什么。 map.computeIfAbsent(Key.Hello, s -> {map.com…

python扩展文件_1. 使用 C 或 C++ 扩展 Python

1.12.给扩展模块提供C API很多扩展模块提供了新的函数和类型供Python使用&#xff0c;但有时扩展模块里的代码也可以被其他扩展模块使用。例如&#xff0c;一个扩展模块可以实现一个类型 "collection" 看起来是没有顺序的。就像是Python列表类型&#xff0c;拥有C AP…

swal ajax,Sweetalert详细介绍

好长时间没有更新文章了&#xff0c;年底工作比较忙&#xff0c;确实是没有时间来写文章。今天忙里偷闲&#xff0c;总结了一款前端提示框的插件——sweetalert——推荐给大家。Sweetalert安装Sweetalert官方为我们提供了三种安装方式&#xff1a;方法一 通过bower安装$ bower …

构造函数必须没有代码

构造函数中应完成多少工作&#xff1f; 在构造函数内部进行一些计算然后封装结果似乎是合理的。 这样&#xff0c;当对象方法需要结果时&#xff0c;我们将准备好它们。 听起来是个好方法&#xff1f; 不&#xff0c;这不对。 这是一个坏主意&#xff0c;原因有一个&#xff1a…

一个路由器两个网段互通_如何判断两个IP地址是否在同一个网段?什么是子网掩码?...

前几天咱们了解&#xff1a;三种方法告诉你项目超过255个摄像机怎么设置IP?什么是公网ip&#xff1f;什么又是内网ip&#xff1f;为什么ip地址通常以192.168开头&#xff1f;也学习了&#xff1a;二、三层交换机与路由器的区别&#xff01;但是有好多人对IP这个概念还是不太清…

服务器appcrash的问题怎么修复,win7的ie出现APPCRASH问题怎么处理?

问题事件名称: APPCRASH 怎么解决?这是Win7或者是Vista特有的一个棘手的问题.APPCRASH(app是程序的意思&#xff0c;crash是坠机的意思。就是程序崩溃了/程序撞车……)(APPCRASH是Win7和Vista中特有的故障&#xff0c;就是程序崩溃引起APPCRASH错误的问题很多 如dll加载错误 软…