什么是响应式编程,Java 如何实现

2022-12-06 0 910

public void request(Connection connection, HttpRequest request) { //处置request,略去标识符 connection.write(response);//顺利完成积极响应 }
mmentCount(Connection connection, HttpRequest request) { Integer commentCount = null; DB(id); } catch(Exception ex) { } } connection.write(commentCount);nse ResultVO response = new ResultVO(); if (voteCount != null) { response.setVoteCount(voteCount); } if (answer != null) { response.setAnswer(answer); } connection.write(response);//顺利完成积极响应 }

在此种同时实现下,你的民主化只须要三个内存池,贯穿了大部份允诺。此种同时实现下,有三个弊病:

那时,NIO 非堵塞 IO 很普及化了,有了非堵塞 IO,他们能透过积极响应式程式设计,来让他们的内存不能堵塞,而要始终在处置允诺。这是甚么样同时实现的呢?

现代的 BIO,是内存将统计数据载入 Connection 后,现阶段内存进入 Block 状况,直至积极响应回到,后接著做积极响应回到后的姿势。NIO 则是内存将统计数据载入 Connection 后,将积极响应回到后须要做的事和模块内存到三个地方性后,间接回到。在有积极响应回到后,NIO 的 Selector 的 Read 该事件会是 Ready 状况,扫描器 Selector 该事件的内存,会说你的内存池统计数据好了,接着内存池内的某一内存,掏出才刚内存的要做的事除了模块,竭尽全力处置。

所以,甚么样同时实现内存积极响应回到后须要做的事和模块的呢?Java 这类提供了三种USB,三个是如前所述反弹的 Callback USB(Java 8 导入的各式各样Functional Interface),一种是 Future 框架。

如前所述 Callback 的同时实现:

public void getAnswer(Connection connection, HttpRequest request) { ResultVO resultVOhrowable2) -> { if (throwable2 == null) { resultVO.setVoteCount(voteCount); } //从统计数据库读取回答信息 getAnswerFromDB(id, (answer, throwable3) -> { if (throwable3 == null) { resultVO.setAnswer(answer); connection.write(resultVO); } else { connection.write(throwable3); } }); }); } else { //获取成功,设置voteCount resultVO.setVoteCount(voteCount); //从统计数据库读取回答信息 getAnswerFromDB(id, (answer, throwable2) -> { if (throwable2 == null) { resultVO.setAnswer(answer); //回到积极响应 connection.write(resultVO); } else { //回到错误积极响应 connection.write(throwable2); } }); } }); }

能看出,随着调用层级的加深,callba

所以如前所述 Future 呢?他们用 Java 8 后导入的 CompletableFuture 来试着同时实现下。

on, HttpRequest request) { ResultVO resultVO = new ResultVO(); //大部份的异步任务都执行完后要做的事 CompletableFuture.allOf( getVoteCountFromCache(id) //发生异常,从统计数据库读取 .exceptionallyComposeAsync(throwable -> getVoteCountFromDB(id)) //读取完后,设置VoteCount .thenAccept(voteCount -> { resultVO.setVoteCount(voteCount); }), getAnswerFromDB(id).thenAccept(answer -> { resultVO.setAnswer(answer); }) ).exceptionallyAsync(throwable -> { connection.write(throwable); }).thenRun(() -> { connection.write(resultVO); }); }

此种同时实现就看上去简单多了,并且读取点赞数量除了读取回答内容是同时进行的。 Project Reactor 在 Completableuture 此种同时实现的基础上,增加了更多的组合方式和更完善的异常处置机制,和面对背压时候的处置机制,除了重试机制。

每日一刷,轻松提升技术,斩获各式各样offer:

什么是响应式编程,Java 如何实现

相关文章

发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务