2017-05-03 82 views
0

我是Vert.x的新手,尝试实现一个小型REST API,它将数据存储在本地文件系统的JSON文件中。编写在文件上执行CRUD操作的Verticles

到目前为止,我设法实现了REST API,因为Vertx在该部分有很好的文档。

我目前正在寻找的是如何在Vert.x中构建数据访问对象的示例。我如何实现可以在包含JSON的文本文件上执行crud操作的Verticle?

你能提供我任何例子吗?任何提示?

更新1:

通过在一个文件我想下面的CRUD操作。想象一下在路径/api/v1/user/:userid/records/上有一个名为Records的REST资源。

在我的Verticle启动我的HTTP服务器我有以下路线。

router.get('/api/user/:userid/records').handler(this.&handleGetRecords) 
router.post('/api/user/:userid/records').handler(this.&handleNewRecord) 

的处理程序方法handleGetRecordshandleNewRecord正在发送使用Vertx事件总线的消息。

request.bodyHandler({ b -> 

    def userid = request.getParam('userid') 

    logger.info "Reading record for user {}", userid 
      vertx.eventBus().send(GET_TIME_ENTRIES.name(), "read time records", [headers: [userId: userid]], { reply -> 

    // This handler will be called for every request 
    def response = routingContext.response() 

    if (reply.succeeded()) { 
     response.putHeader("content-type", "text/json") 
     // Write to the response and end it 
        response.end(reply.result().body()) 
    } else { 

     logger.warn("Reply failed {}", reply.failed()) 
     response.statusCode = 500 
     response.putHeader("content-type", "text/plain") 

     response.end('That did not work out well') 
    } 
    }) 
}) 

然后是另一个verticle消耗这些消息GET_TIME_ENTRIESCREATE_TIME_ENTRY。我认为这个消费者Verticle是Records的数据访问对象。该verticle可以读取包含所有用户记录的给定:userid的文件。该verticle能够

  • 添加一条记录
  • 读取所有记录
  • 读取特定记录
  • 更新记录
  • 删除一个或所有记录

这里是读取所有记录的示例。

vertx.eventBus().consumer(GET_TIME_ENTRIES.name(), { message -> 

    String userId = message.headers().get('userId') 
    String absPath = "${this.source}/${userId}.json" as String 

    vertx.fileSystem().readFile(absPath, { result -> 

     if (result.succeeded()) { 
      logger.info("About to read from user file {}", absPath) 
      def jsonObject = new JsonObject(result.result().toString()) 
      message.reply(jsonObject.getJsonArray('records').toString()) 
     } else { 
      logger.warn("User file {} does not exist", absPath) 
      message.fail(404, "user ${userId} does not exist") 
     } 
    }) 
}) 

我想要实现读取文件中像我上面没有和deserialise的JSON到一个POJO(例如List<Records>)。使用Vertx的JsonObject似乎更加方便。我不想操纵JsonObject实例。

+0

CRUD操作对文件有什么意义? Vert.x具有用于异步文件操作的文件系统API,如果这就是您要找的内容http://vertx.io/docs/vertx-core/java/#_using_the_file_system_with_vert_x – tsegismont

+0

@tsegismont感谢您的反馈。我试图更加精确。请参阅我的更新 – saw303

回答

1

首先,我认为使用EventBus的方法很好。它可能会慢一点,因为EventBus会序列化/反序列化你的对象,但它会给你一个很好的解耦。的另一种方法,你可以在这里看到

例子:
https://github.com/aesteve/vertx-feeds/blob/master/src/main/java/io/vertx/examples/feeds/dao/RedisDAO.java

注意每一个方法如何接收处理程序作为其最后一个参数:

public void getMaxDate(String feedHash, Handler<Date> handler) { 

多个耦合的,而且效率更高。

而对于比较经典的,直接的方法,你可以看到官方的例子:

https://github.com/aokolnychyi/vertx-example/blob/master/src/main/java/com/aokolnychyi/vertx/example/dao/MongoDbTodoDaoImpl.java

您可以看到,这里DAO是几乎同步,但由于处理程序仍然是异步,它的罚款无论如何。

+0

我选择了eventBus以便能够在集群模式下运行解决方案。但是,当然你对序列化/反序列化开销是正确的。 – saw303

相关问题