本文是对Vert.x Blueprint - Todo Backend的分析。
Handler -> Future
以API Delete all todo entities: DELETE /todos
为例,
第一次简单实现(REST API with Vert.x Web一节的做法)
代码实现为SingleApplicationVerticle.java L211:
private void handleDeleteAll(RoutingContext context) {
redis.del(Constants.REDIS_TODO_KEY, res -> {
if (res.succeeded())
context.response().setStatusCode(204).end();
else
sendError(503, context.response());
});
}
redis.del()
函数是vert.x标准的func(param1, param2, handler)
格式。
在[Decouple controller and service][dcas]一节实现了服务(service)和
控制器(controller)的解耦,这个API的控制器部分在[TodoVerticle.java L220]:
private void handleDeleteAll(RoutingContext context) {
service.deleteAll()
.setHandler(deleteResultHandler(context));
}
服务分为两部分,接口在TodoService.java文件中, Redis服务的具体实现在RedisTodoService.java L112:
@Override
public Future<Boolean> deleteAll() {
Future<Boolean> result = Future.future();
redis.del(Constants.REDIS_TODO_KEY, res -> {
if (res.succeeded())
result.complete(true);
else
result.complete(false);
});
return result;
}
也就是将func(param1, param2, handler)
改为futureFunc().setHandler()
,
将具体的处理逻辑包括handler都放到futureFunc()
中完成,
然后返回一个future
对象,
再调用future
对象的setHandler()
方法完成整个异步处理过程。
Load Configurations
vert.x应用是通过在命令java -jar <fat-jar>.jar -conf <conf-path>
中的
-conf
选项加载应用配置的。
举例来说,config/config.json文件内容为:
{
"service.type": "redis"
}
当以下面的方法启动应用时:
java -jar build/libs/vertx-blueprint-todo-backend-fat.jar -conf config/config.json
表达式config().getString("service.type", "redis")
返回值为"redis"
,
其中config()
是定义在抽象类AbstractVerticle
中的公有方法,
所以可以在AbstractVerticle
的子类方法中直接使用。