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: