响应式编程RxJava之Subject

概述 RxJava中常见的Subject有4种,分别是 AsyncSubject、 BehaviorSubject、 PublishSubject、 ReplaySubject。 一定要用Subcect.create()的方式创建并使用,不要用just(T)、from(T)、create(T)创建,否则会导致失效 AsyncSubject 简单的说使用AsyncSubject无论输入多少参数,永远只输出最后一个参数。 // 无论订阅的时候AsyncSubject是否Completed,均可以收到最后一个值的回调 AsyncSubject as = AsyncSubject.create(); as.onNext(1); as.onNext(2)

  • 凯文
3 min read
java

响应式编程RxJava之Single

简单入门 Single.just(T value); 通常使用RxJava,主要是为了异步处理一些任务。即传入一些值,经过逻辑处理之后返回结果。 以上代码中的just(T value),可以看作是传入参数。 有了输入,如何输出呢?我们讲到了异步处理,那自然得有一个异步回调才行吧,这简直理所应当吧。所以这里介绍最重要的"subscribe"概念。 Single.just(T value).subscribe(); 例如: int addValue(int a,

  • 凯文
8 min read
java

reactor响应式编程之 Mono & flux

Publisher 由于响应流的特点,我们不能再返回一个简单的POJO对象来表示结果了。必须返回一个类似Java中的Future的概念,在有结果可用时通知消费者进行消费响应。 Reactive Stream规范中这种被定义为Publisher<T> ,Publisher<T>是一个可以提供0-N个序列元素的提供者,并根据其订阅者Subscriber<? super T>的需求推送元素。一个Publisher<T>可以支持多个订阅者,并可以根据订阅者的逻辑进行推送序列元素。下面这个Excel计算就能说明一些Publisher<T>的特点。 Publisher&

  • 凯文
5 min read
java

响应式编程之RxJava VS Reactor

目前市场上比较流行的有几种,RxJava,Akka,Vert.x,Reactor。最常使用的两种框架,并且实现了响应式编程规范的是RxJava和Reactor。 两者之间有什么区别呢? API Flowable和FluxAPI很相似都支持,ReactiveX常见的那些操作符。map,filter,flatmap等等,具体操作符列表:http://reactivex.io/documentation/operators.html 在Java版本上: RxJava2.x必须至此Java 6,因为它Rxjava在安卓中用的很多 Reactor则至少要求Java 8. 其内部利用了很多新版Java的特性。并且还可以方便的转换为:CompletableFuture,java.

  • 凯文
4 min read
java

jvm类的加载及方法调用过程

类的加载过程 加载 加载是指查找字节流,并且据此创建类的过程。 加载需要借助类加载器,在 Java 虚拟机中,类加载器使用了双亲委派模型,即接收到加载请求时,会先将请求转发给父类加载器。 链接 验证:确保被加载类能够满足 Java 虚拟机的约束条件 准备:为被加载类的静态字段分配内存;部分 Java 虚拟机还会在此阶段构造其他跟类层次相关的数据结构,比如说用来实现虚方法的动态绑定的方法表 解析:将符号引用解析成为实际引用;如果符号引用指向一个未被加载的类,或者未被加载类的字段或方法,那么解析将触发这个类的加载(但未必触发这个类的链接以及初始化。) 初始化 常量值(ConstantValue)初始化直接由 Java

  • 凯文
7 min read

java基本数据类型

java基本数据类型介绍 在java中 false实际值为0 true为1 Java 的基本类型都有对应的值域和默认值。可以看到,byte、short、int、long、float 以及 double 的值域依次扩大,而且前面的值域被后面的值域所包含。因此,从前面的基本类型转换至后面的基本类型,无需强制转换。另外一点值得注意的是,尽管他们的默认值看起来不一样,但在内存中都是 0。 在 Java 中,正无穷和负无穷是有确切的值,在内存中分别等同于十六进制整数 0x7F800000 和 0xFF800000。0x7F800001 对应的浮点数是

  • 凯文
4 min read
java

Java 虚拟机执行Java 字节码过程

Java 虚拟机具体是怎样运行 Java 字节码的 java类加载 从虚拟机视角来看,执行 Java 代码首先需要将它编译而成的 class 文件加载到 Java 虚拟机中。加载后的 Java 类会被存放于方法区(Method Area)中。实际运行时,虚拟机会执行方法区内的代码。 如果你熟悉 X86 的话,你会发现这和段式内存管理中的代码段类似。而且,Java 虚拟机同样也在内存中划分出堆和栈来存储运行时数据。 不同的是,Java 虚拟机会将栈细分为面向 Java 方法的

  • 凯文
5 min read

业务日志收集

问题 当服务qps过高时,如果收集业务日志时直接写入kafka可能会导致接口延时上升,另外直接写入的日志不一定可直接使用,需要经过fink过滤处理,固采用以下方式收集海量的业务日志 服务将日志通过 log的方式写入碰盘文件,可异步写,降低io次数 有专门的agent采集文件日志,并写入kafka 将kafka的数据传输至flink中进行过滤处理,然后再导入另一个kafka topic 读取新的kafka topic数据,写入hive或 es

  • 凯文
1 min read
linux

linux之lsof

lsof命令是什么? 可以列出被进程所打开的文件的信息。被打开的文件可以是 普通的文件 目录 网络文件系统的文件 字符设备文件 (函数)共享库 管道,命名管道 符号链接 底层的socket字流,网络socket,unix域名socket 在linux里面,大部分的东西都是被当做文件的…..还有其他很多 lsof使用 列出所有打开的文件: lsof 备注: 如果不加任何参数,就会打开所有被打开的文件,建议加上一下参数来具体定位 查看谁正在使用某个文件 lsof /filepath/file 递归查看某个目录的文件信息 lsof +D /filepath/

  • 凯文
2 min read
java

java-mysql时区问题

问题 数据库时间展示正常,但是web页面时间与数据库时间差 13/14 个小时 原因 mysql采用的是CST时区,而java使用的是北京时间,两个时区有时差13个小时有时差14个小时,故从数据库查出数据后,如果直接展示无问题,但是如果通过java程序 SimpleDateFormat转换,就会出现问题 解决方案 在通过SimpleDateFormat转换时间时,设置时区为 CST 此方案,后续所有使用SimpleDateFormat转换数据库时间时,都需要指定TimeZone 但是通过SimpleDateFormat转换非数据库date(如 当前date)时,不需要指定TimeZone format.setTimeZone(TimeZone.getTimeZone("CST&

  • 凯文
1 min read
java

spring bean factory介绍

问题 singletonObjects与earlySingletonObjects的作用 如果singletonFactories中存放的内容 如何解决循环引用问题 aop对应的代理类如何保存实例 spring 缓存 singletonObjects-一级缓存 private final Map<String, Object> singletonObjects = new ConcurrentHashMap<>(256); spring 单例对象集合,所有的实例实例化完成后均需要保存在该变量中,该变量的key为bean name,value为spring管理的实例 在spring 创建实例完成后,添加至该缓存中,并且将该实例从earlySingletonObjects中移除,且将该实例对应的factory从singletonFactories中移除 singletonFactories-三级缓存

  • 刘凯
2 min read
http

http2.0实战

生成证书 keystore以及服务器密钥对儿的生成 bogon:cert liukai$ keytool -genkeypair -alias rabbitsslkey -keyalg RSA -validity 3650 -keystore rabbitkeystore.jks 输入密钥库口令: 再次输入新口令: 您的名字与姓氏是什么? [Unknown]: localhost 您的组织单位名称是什么? [Unknown]: localhost 您的组织名称是什么? [Unknown]: localhost 您所在的城市或区域名称是什么? [Unknown]: localhost 您所在的省/市/自治区名称是什么?

  • 刘凯
6 min read
http

http2.0

静态表编码 静态表类型 静态表很简单,只包含已知的header字段。分为两种: name和value都可以完全确定,比如:metho: GET、:status: 200 该情况很好理解,已知键值对直接使用一个字符表示; 只能够确定name:比如:authority、cookie 此种情况稍微说明下:首先将name部分先用一个字符(比如cookie)来表示,同时,根据情况判断是否告知服务端,将 cookie: xxxxxxx 添加到动态表中(我们这里默认假定是从客户端向服务端发送消息) 静态表使用 HTTP/2 将 61

  • 刘凯
15 min read
redis

Redis键空间通知事件

作用 键空间通知使得客户端可以通过订阅频道或模式, 来接收那些以某种方式改动了 Redis 数据集的事件。 事件通过 Redis 的订阅与发布功能(pub/sub)来进行分发, 因此所有支持订阅与发布功能的客户端都可以在无须做任何修改的情况下, 直接使用键空间通知功能。 因为 Redis 目前的订阅与发布功能采取的是发送即忘(fire and forget)策略, 所以如果你的程序需要可靠事件通知(reliable notification of events), 那么目前的键空间通知可能并不适合你: 当订阅事件的客户端断线时, 它会丢失所有在断线期间分发给它的事件。 开启键空间通知 因为开启键空间通知功能需要消耗一些 CPU , 所以在默认配置下, 该功能处于关闭状态。

  • 刘凯
3 min read