DarkMatter in Cyberspace
  • Home
  • Categories
  • Tags
  • Archives

vertx-blueprint-todo-backend代码分析


本文是对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的子类方法中直接使用。



Published

Apr 13, 2017

Last Updated

Apr 13, 2017

Category

Tech

Tags

  • callback 1
  • future 1
  • handler 1
  • vertx 5
  • web 16

Contact

  • Powered by Pelican. Theme: Elegant by Talha Mansoor