我们已经实现了我们的足球运动员微服务,以使其异步且非 I/O 阻塞。但是如果我们一起使用 Vert.x 和 RxJava,我们可以获得更多的东西。
RxJava 是用于 Java 编程语言的 Rx 的出色实现,并为您提供了一些将 Vert.x Future 的强大功能与 Rx 运算符的优点相结合的功能。
为了使用 RxJava,您必须在 Maven pom.xml 中设置以下依赖项:
让我们从一个简单的例子开始。
我们可以创建三个新类,它们实现了前面描述的相同方法,但以反应方式:
- FootballPlayerReactiveVerticle
- ActionHelperReactive
- FootballPlayerReactiveDAO
在 FootballPlayerVerticle 类中,我们创建了构建 HTTP 服务器所需的方法,该服务器处理对我们 API 的请求:
我们修改 FootballPlayerReactiveVerticle 类以返回一个 Rx Completable 类,这是一个指示其完成的流:
另一个重要元素是我们连接到数据库的方式。
在我们的 DAO 中,我们创建了以下方法来执行此操作:
在 FootballPlayerReactiveDAO 类中,我们可以更改方法以返回 Rx Single 而不是 Future。 Single 类似于 Observable 的对象,但它不是发出一系列值,而是发出一个值或错误通知。以下是重新审视的方法:
所有交互都将以反应方式完成:例如,要读取包含创建数据库表的指令并填充它们的文件,我们可以使用 FileSystem 中的 rxReadFile班级:
我们实现的响应式版本中使用的所有类都属于 io.vertx.reactivex 包。
此外,可以以反应方式重新访问执行 CRUD 操作所需的方法。例如,update 方法可以这样重写:
与 FootballPlayerDAO 中实现的版本的主要区别在于使用 rxUpdateWithParams,它将执行 SQL UPDATE 操作并返回一个 Single 对象而不是 Future,在方法结束时关闭 JDBC 连接。
使用 Config 文件中定义的配置构建 HTTP 服务器的最终管道,必须能够处理我们的 API,如下所示:
我使用 flatMap 方法连接操作,并使用 doOnSuccess 方法从观察到的流中接收项目并实现与它们相关的逻辑。
管道的关键部分是 subscribe 方法:如果不调用它,则不会发生任何事情,因为流是惰性的。