2017-05-03 4 views
0

저는 Vert.x를 처음 사용하고 있으며 로컬 파일 시스템의 JSON 파일에 데이터를 저장하는 작은 REST API를 구현하려고합니다.파일에 CRUD 작업을 수행하는 Verticle 작성하기

지금까지 REST API를 구현할 수 있었던 이유는 Vertx가 그 부분에서 잘 설명되어 있기 때문입니다.

내가 현재 찾고있는 것은 Vert.x에서 데이터 액세스 개체를 작성하는 방법의 예입니다. JSON이 포함 된 텍스트 파일에서 정밀 작업을 수행 할 수있는 Verticle을 구현하려면 어떻게해야합니까?

나에게 사례를 제공해 줄 수 있습니까? 어떤 힌트?

업데이트 1 : 나는 다음과 같은 생각하고 파일에 CRUD 작업으로

. 경로 /api/v1/user/:userid/records/에 노출 된 Records이라는 REST 리소스가 있다고 가정 해 보겠습니다.

내 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') 
    } 
    }) 
}) 

그런 다음 이러한 메시지 GET_TIME_ENTRIES 또는 CREATE_TIME_ENTRY을 소비하는 또 다른 verticle있다. 나는이 소비자 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") 
         } 
        }) 
    }) 
    

    는 내가 달성하기 위해 노력하는 것은 POJO로 JSON (예를 들어,이 List<Records>를) 내가 위에서처럼 파일을 읽고 deserialise하는 것입니다. 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가 객체를 serialize/deserialize 할 것이기 때문에 다소 느릴 수 있습니다. 그러나 매우 좋은 디커플링을 제공합니다. 당신은 여기에서 볼 수있는 또 다른 방법의

    예 : 모든 방법은 마지막 인자로 핸들러를 수신하는 방법
    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