旧系统改造之响应式编程的应用

前言

java是一门庞大的语言, 说他庞大是因为用的人太多了, 我觉得他也是未来的趋势, 他在不断的吸收来自各方的优点, 将事物创造的过程越来越自然化, 事物本身就是完美的简洁的, 如果一段代码很复杂晦涩难懂, 那他一定是错的, 是可以优化的. 说的多了, 本文主要讲RxJava2在具体项目中的应用, 这个是jdk8之后加入的功能, 那么他是怎么来的, 为什么要来呢?

引入

现代应用需要应对大量的并发用户, 之前的处理一般都是阻塞式的编码方式. 下面引入百度的一段话:

  1. 阻塞式的编码方式

通常,Java开发者使用阻塞式(blocking)编写代码。这没有问题,在出现性能瓶颈后, 我们可以增加处理线程,线程中同样是阻塞的代码。但是这种使用资源的方式会迅速面临 资源竞争和并发问题。

更糟糕的是,阻塞会浪费资源。具体来说,比如当一个程序面临延迟(通常是I/O方面, 比如数据库读写请求或网络调用),所在线程需要进入 idle 状态等待数据,从而浪费资源。

2.异步非阻塞的方式

提高执行效率——可以解决资源浪费问题。通过编写 异步非阻塞 的代码, (任务发起异步调用后)执行过程会切换到另一个 使用同样底层资源 的活跃任务,然后等 异步调用返回结果再去处理。
但是在 JVM 上如何编写异步代码呢?Java 提供了两种异步编程方式:

回调(Callbacks) :异步方法没有返回值,而是采用一个 callback 作为参数(lambda 或匿名类),当结果出来后回调这个 callback。常见的例子比如 Swings 的 EventListener。Futures :异步方法 立即 返回一个 Future,该异步方法要返回结果的是 T 类型,通过Future封装。这个结果并不是 *立刻* 可以拿到,而是等实际处理结束才可用。比如,ExecutorService 执行 Callable 任务时会返回 Future 对象。这些技术够用吗?并非对于每个用例都是如此,两种方式都有局限性。

回调很难组合起来,因为很快就会导致代码难以理解和维护。

概念

响应式编程的概念

我觉得主要是引入了非阻塞的异步处理, 正好比各种中间件技术的流行, java每一个大版本的更新都要把各方好的概念融合进来.

响应式编程是一种关注于数据流data streams)和事件传递的异步编程方式。它是面向对象编程中的“观察者模式”的在多线程异步编程一种实现。

在响应式流中, 当有新的数据到来的时候 ,由发布者(Publisher) 通知订阅者(Subscriber)。此外,对推送来的数据的操作 是通过一种声明式(declaratively)而不是命令式(imperatively)的方式表达的:开发者通过 描述“控制流程”来定义对数据流的处理逻辑。

除了数据推送以外,响应式编程对错误处理(error handling)和完成(completion)的定义实现也很完善。 一个 发布者 可以推送新的数据到它的 订阅者(调用 onNext 方法), 同样也可以推送错误(调用 onError 方法)和完成(调用 onComplete 方法)信号。 错误和完成信号都可以终止响应式流。可以用下边的表达式描述:

onNext x 0…N [onError | onComplete]这种方式非常灵活,无论是有/没有值,还是 n 个值(包括有无限个值的流,比如时钟的持续读秒),都可处理。

如何编写

如何编写响应式编程的代码呢, 当然这不是本文的重点, 可以翻看作者其他的文章, 会有详细讲解.

应用场景

那么我们在实际场景中是怎么应用Rxjava来解决问题的呢, 本文主要是针对旧系统的改造, 鉴于旧系统是jdk6, 所以首先要把重做的功能脱离出旧系统, 重启一个服务, 至少要jdk8. 引入Rxjava2的依赖:

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

这次要解决的是问卷模块, 未完待续…

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值