Help us understand the problem. What is going on with this article?

kotlinによるvert.xラッパー(vertx3-lang-kotlin)を更にラップしてみるYO!

More than 3 years have passed since last update.

Kotlinのウェブフレームワークを探しているのですが、vertx3-lang-kotlinがなかなか良さそうです。
Vert.xのラッパーのようなので安定性やパフォーマンス面でも問題ないでしょう。

vertx3-lang-kotlinによるHTTP処理

import io.vertx.kotlin.lang.*

fun main(args: Array<String>) {
    DefaultVertx {
        httpServer(8084, "0.0.0.0", Route {
            GET("/path") { request ->
                bodyJson {
                    "field1" to "test me not"
                }
            }

            otherwise {
                setStatus(404, "Resource not found")
                body {
                    write("The requested resource was not found\n")
                }
            }
        })
    }
}

簡潔ですしなかなかよいのですが、ルーター周りが分割もできなさそうだしあまり好みではない感じです。(主観)
僕は一般的なMVCフレームワークみたいに、コントローラクラスがルーター的な定義をあるていど内包する形式が好みです。

そこで、vertx3-lang-kotlinを更にラップして好みな感じにしてみました。
(vertxのオブジェクトも露出する前提なので、ラップしたというよりルーター部分を取り替えたという方が近いかも)
そのラップしたフレームワークを使ってコントローラの定義とサービスの実行などをする例がこちら。

package net.devneko.birdx

import io.vertx.core.Vertx
import io.vertx.kotlin.lang.json.object_

class MyController(handler: RequestHandler) : RequestHandler by handler {

    companion object Router {
        fun new(v:RequestHandler) = MyController(v)
        fun router() = BirdxRouter.new {
            get("/controller", { new(this).index() })
        }
    }

    fun index() {
        replyText("controller index")
    }
}

class MyAppService(val vertx:Vertx) {
    fun execute(param:String, resultHandler:(String)->Unit) {
        // 時間のかかる処理を非同期で実行
        vertx.executeBlocking<String>({ h ->
            Thread.sleep(1000);
            val result = param + param
            h.complete(result)
        },{ asyncResult ->
            // 結果をコントローラに返す
            resultHandler(asyncResult.result())
        })
    }
}

fun main(args : Array<String>) {

    val birdx = Birdx {
        router {
            get("/") {
                // パラメータを渡してサービスを実行
                MyAppService(vertx).execute(param("msg")) { result ->
                    replyText(result)
                }
            }
        }
    }

    // コントローラを追加できる
    val r1 = BirdxRouter()
    r1.get("/add",{
        replyJson {
            object_("a" to "b")
        }
    })
    birdx.addRouter(r1)

    // よくあるコントローラクラスみたいのも使える
    birdx.addRouter(MyController.router())

    // サーバー起動
    birdx.start(8080)
}

すっきりしない部分はあるものの、ルーター・コントローラー周りは分割しやすくなりました。

それにしてもKotlin,Vert.xの組み合わせはなかなか可能性を感じますので、これで小さなサービスでも作ってみたいですね。

一応GitHubにおいておきます。

GitHub:dotneet/birdx

来年はKotlin飛躍の年となりますように。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした