Apache Camel を使った HTTP 処理とファイル入出力 - Jettry, File コンポーネント使用

Apache Camel の Jetty コンポーネントで HTTP リクエストを処理できるようなので、簡単なサンプルを作ってみる事にした。(ついでに File コンポーネントも使う)

なお、Jetty コンポーネントを使うには Apache Camel に同梱されている jar ファイル以外に以下が必要な点に注意。

  • jetty-x.x.x.jar
  • jetty-util-x.x.x.jar
  • jetty-client-x.x.x.jar

今回は、Jetty 6.1.11 の jar ファイルを Groovy でロードできるように groovy-starter.conf を設定して使う事にした。(Apache Camel も同様)

Jetty コンポーネント

Jetty コンポーネントは "jetty:http://hostname[:port][/resourceUri][?options]" という URI で使用する。
例えば、"jetty:http://localhost/test" とすると "http://localhost/test" でアクセス可能となり、この URL へのアクセスが Jetty コンポーネントで処理される。

HTTP リクエストは、入力(In) Message から取得した javax.servlet.http.HttpServletRequest オブジェクト(getBody() で取得)を使って処理し、レスポンスの内容は出力(Out) Message に setBody() する。

File コンポーネント

File コンポーネントは "file:fileOrDirectoryName[?options]" という URI で使用する。
File コンポーネントは from() で使うとファイル入力、to() で使うとファイル出力が処理できる。
to() で使う場合のファイル名は org.apache.camel.file.name ヘッダーを定義する事で指定する事ができる(指定しないとデフォルト値)。

サンプル作成

というわけで、Groovy でサンプルを書いてみた。
処理は以下の 2つのフローで構成される。

  • URL アクセスで発生する処理
    1. "http://localhost/test" URL へのアクセスを感知
    2. HTML を出力(Out) Message に設定
    3. HTML の内容をファイルに保存(logs ディレクトリ内にファイル作成)
  • ファイル作成で発生する処理
    1. logs ディレクトリ内のファイル作成を感知
    2. ファイルのパスとファイルの内容を標準出力へ
test_jetty.groovy ファイル
import org.apache.camel.Processor
import org.apache.camel.impl.DefaultCamelContext
import org.apache.camel.builder.RouteBuilder

class SampleRoute extends RouteBuilder {
    void configure() {

        from("jetty:http://localhost/test").to("direct:response")

        from("direct:response").process({

            def req = it.in.getBody(javax.servlet.http.HttpServletRequest.class)
            def id = req.getParameter("id")

            it.out.setBody("<html><body><h1>id=${id}</h1></body></html>", String.class)
            //以下のような記述ではファイルが出力されなくなるため注意
            //it.out.body = "<html><body><h1>id=${id}</h1></body></html>"

        } as Processor).to("file:logs")

        from("file:logs").process({
            //ファイルのパスとファイル内容を出力
            println "${it.file.path} : ${it.file.text}"
        } as Processor)
    }
}

ctx = new DefaultCamelContext()
ctx.addRoutes(new SampleRoute())

ctx.start()

println "start Camel"

System.in.read()

ctx.stop()

サンプルの実行と動作確認

サンプルスクリプトを実行する。

サンプル実行
>groovy test_jetty.groovy
Created MBeanServer with ID: ・・・
2008-09-19 20:57:08.801::INFO:  Logging to STDERR via org.mortbay.log.StdErrLog
2008-09-19 20:57:08.092::INFO:  jetty-6.1.11
2008-09-19 20:57:08.152::INFO:  Started SelectChannelConnector@0.0.0.0:80
start Camel

Web ブラウザで "http://localhost/test?id=testdata" にアクセスすると、Web ブラウザに HTML が表示され、logs ディレクトリ内にファイルが生成される。
生成されたファイルの内容が標準出力に出力され、ファイルは logs\ID-fits\49214-1221832180216\1-0 から logs\ID-fits\49214-1221832180216\.camel\1-0 に移動。(from に使った File コンポーネントの機能でそうなる)

結果
・・・
start Camel
logs\ID-fits\49214-1221832180216\1-0 : <html><body><h1>id=testdata</h1></body></html>