G::blog

主にVert.xやYokeについての覚書

Yoke 用の Middleware を作成する

Yoke は、Middleware という概念を持っていて、その実装であるさまざまな Middleware を組み合わせてアプリケーションを構築することが可能です(Yoke には、直ぐに利用できる 14種類の Middleware が現時点ではバンドルされています)。

この記事では、アプリケーション(トップレベルのModule)の中に簡単な Middleware を作成し利用する方法を説明します。しかし、Yoke や Vert.x の内部の詳細について、わかっていないことがまだまだ多く、大雑把で間違いを含んだ記述にならざるを得ない点、あらかじめご了承ください。発見があればその都度追記していきたいと思います。

1. Yoke の Gradle テンプレートを入手し、プロジェクトの作業ディレクトリを作る

まず、Gradle テンプレートを取得し、それを利用してプロジェクトの作業ディレクトリを作成します。

$ curl -0 http://pmlopes.github.io/yoke/yoke-gradle-template.tar.gz | tar -zx
$

名前を変えます (この記事ではyoke-mwという名前にします)。

$ mv yoke-gradle-template yoke-mw
$ cd yoke-mw
$

2. Verticle を書く

今回は、JavaScript で Verticle を書きます。
src/main/resources の下に、以下の内容の JavaScript ファイルを作ります。
ファイル名は HelloWorldVerticle.js とします。

var Yoke = require('yokejs/Yoke');

var yoke = new Yoke();
yoke.use(function (req) {
  req.response().end('Hello World');
});

yoke.listen(8080);

3. mod.jsonファイルを編集する

src/main/resources の下に、mod.json があります。次のように修正します。

{
  "main": "HelloWorldVerticle.js",
    "includes": "com.jetdrone~yoke~1.0.0-beta2"
}

"main" には、「2. Verticleクラスを書く」で作成した JavaScriptファイルを src/main/resources からの相対パス名で記述します。

4. 最新の Vert.x を利用するように gradle.properties を修正する

現時点の最新は、2.0.0-CR1 なので、次のように修正しました。

# The version of Vert.x
#vertxVersion=2.0.0-beta3
vertxVersion=2.0.0-CR1

5. アプリケーションを実行しブラウザで閲覧してみる

コンソール(ターミナル)から実行します。

linux/unix系は、

% ./gradlew runMod

windowsは、

% gradlew.bat runMod

です。

うまく起動したら、ブラウザで http://localhost:8080 にアクセスしてみます。

Hello World と表示されたら OK です。

6. Middleware を作ってみる

5.までは、簡単な Yoke のサンプルの作り方の説明でした。
というわけで、いよいよ目的の簡単な Middleware を作っていきます。

今回は Middleware クラスは Javaで書きます。Middleware は、Groovyでも書けそうですが、まだやれておらず問題なく実際に作れるかは定かではありませんがおそらく大丈夫でしょう。JavaScriptでの記述もまだやれていないのですが、Router.js(yoke/src/main/resources/yokejs/middleware/Router.js)を参考にすれば実装できそうです。

では、実装しています。
まず、Javaで記述する Middleware クラスは "com.jetdrone.vertx.study.middleware" というパッケージに今回は置きます。
もっと短いパッケージ名にすることも可能ですが、パッケージの頭は "com"あるいは"org"といった値でないと Rhino が org.mozilla.javascript.EcmaError: ReferenceError: "XXXX" is not defined. といった例外を出します。たとえば、"middleware" とか "jp.co.hoge" といったパッケージ名だとそうなりました。"com"や"org"以外にもうまくいくものがあるかもしれませんが、まだ探せていません。それ以前に、何か設定をすれば "middleware" とか "jp.co.hoge"を含めてなんでもうまくいきそうな気もしますが、まだそのためにどうすればよいのか見つかっていません。というわけでここでは、"com.jetdrone.vertx.study.middleware" というパッケージを利用します (このあたり何かわたしの勘違いがあるかもしれませんので注意してください)。

今回作成する Middleware は、#handle() が呼び出されると標準出力に文字列を出すだけです。

package com.jetdrone.vertx.study.middleware;

import org.vertx.java.core.Handler;

import com.jetdrone.vertx.yoke.Middleware;
import com.jetdrone.vertx.yoke.middleware.YokeRequest;

public class SimpleMiddleware extends Middleware {

	@Override
	public void handle(YokeRequest request, Handler<Object> next) {
		System.out.println("SimpleMiddleware#handle");
		next.handle(null);		
	}

}

このクラスのJavaファイル(SimpleMiddleware.java)を src/main/java/com/jetdrone/vertx/study/middleware に作成します。


次に、この Middleware を JavaScript から要求(require())できるようにスタブを書きます。

src/main/resources/middleware の下に、SimpleMiddleware.js という JavaScript ファイルを作成し以下のよう記述します。

module.exports = com.jetdrone.vertx.study.middleware.SimpleMiddleware;


これで、SimpleMiddleware を利用する準備が整いました。

2. で作成した、HelloWorldVerticle.js ファイルを開き以下のように修正します。

var Yoke = require('yokejs/Yoke');
var SimpleMiddleware = require('middleware/SimpleMiddleware') // 上で作成したスタブを記述する

var yoke = new Yoke();

yoke
  .use(new SimpleMiddleware())
  .use(function (req) {
     req.response().end('Hello World');
  })
  .listen(8080);


編集し終わったら gradlew runMod を実行し、ブラウザで http://localhost:8080 にアクセスしてみます。
ブラウザに、Hello world と表示され、さらにコンソールにも SimpleMiddleware#handle と出力されたなら無事作業完了です。