2017-05-03 10 views
0

私はVert.xを使い慣れていて、そのデータをローカルファイルシステムのJSONファイルに保存する小さなREST APIを実装しようとしています。ファイルにCRUD操作を実行するVerticleを書く

これまでREST APIを実装していたのは、Vertxがその部分で非常によく文書化されているからです。

私が現在探しているのは、Vert.xでデータアクセスオブジェクトを構築する方法の例です。 JSONを含むテキストファイルに対して厳密な操作を実行できるVerticleを実装するにはどうすればよいですか?

私に例を教えていただけますか?何かヒント?

UPDATE 1:私は、次のことを考えていたファイルのCRUD操作で

。 に露出したRecordsというRESTリソースがあるとします。

私のHTTPサーバを起動する私のverticleには、私は以下のルートがあります。

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を消費し、別の垂直方向のがあります。私はRecordsのデータアクセスオブジェクトとして、この消費者の頂点を考える。この頂点は、すべてのユーザーレコードを含む指定された:useridのファイルを読み取ることができます。記録

  • を追加

    • することができますが、
    • すべてのレコードを読み取る垂直方向のレコード
    • がまたはすべてのレコード

    を削除

  • 更新はここで特定のレコードを読み込みますすべてのレコードを読む例

    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") 
         } 
        }) 
    }) 
    

    私は何を達成しようとすると、私は上記のようにやったファイルを読み込み、(例えばList<Records>)POJOにJSONを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はオブジェクトをシリアライズ/デシリアライズするため、少し遅くなることがありますが、非常に優れたデカップリングが得られます。あなたがここに見ることができる別のアプローチの

    例:すべてのメソッドは、その最後の引数としてハンドラをどのように受け取るか
    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) { 
    

    結合より、だけでなく、より効率的。あなたがここにDAOが同期ほとんどですが、ハンドラはまだ非同期なので、それは罰金だと見ることができます

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

    そして、もっと古典的かつ直接的なアプローチのために、あなたは公式の例を見ることができますとにかく

    +0

    を参照してください。ソリューションをクラスタ化モードで実行できるようにするにはeventBusを選択しました。もちろん、シリアライゼーション/デシリアライゼーションオーバーヘッドについてはあなたが正しいです。 – saw303

    関連する問題