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 アクセスで発生する処理
- "http://localhost/test" URL へのアクセスを感知
- HTML を出力(Out) Message に設定
- HTML の内容をファイルに保存(logs ディレクトリ内にファイル作成)
- ファイル作成で発生する処理
- logs ディレクトリ内のファイル作成を感知
- ファイルのパスとファイルの内容を標準出力へ
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>