Apache Camel で Esper を使ったイベント処理 - Esper コンポーネント使用
Apache Camel の Camel Extra プロジェクトには Camel 上で Esper のイベント処理を行うための Esper コンポーネント(camel-esper ライブラリ)が用意されているので、これを使って Camel 上で簡単な Esper を使ったイベントのフィルタリング処理を試してみる事にする。
ただし、camel-esper 1.0 ライブラリがサポートしている Esper のバージョンは 1.11.0 と古いため、Esper 2.3.0 用に改造した上で使用する。
今回使用した環境は以下の通り。
camel-esper ライブラリの Esper 2.3.0 対応
まず、このサイトの説明にある通り、Subversion を使って camel-esper のソースコードを取得する。
>svn checkout http://camel-extra.googlecode.com/svn/trunk camel-extra
次に、取得した components/camel-esper 内のソースコードを以下の要領で変更する。
- net.esper パッケージを com.espertech.esper パッケージに名称変更
- EsperEndpoint.java 内の createEQL メソッドを createEPL に変更
変更したソースを esper-2.3.0.jar をクラスパスに通してコンパイルし、JAR ファイルを生成する。
今回は Maven2 でかなり強引に JAR ファイルを作成した。(個人的に Maven は融通が利かない気がするので苦手)
- .m2/repository/esper/esper/2.3.0 に esper-2.3.0.jar を手動で配置
- camel-extra/components/camel-esper/pom.xml ファイル内の Esper のバージョン設定を 1.11.0 から 2.3.0 に変更
- camel-extra/components/camel-esper/src/test/java/org/apache/camel/component/esper/EsperRouteTest.java を削除(テストフェーズをスキップさせるため)
- mvn package で camel-esper の JAR ファイル作成(camel-extra/components/camel-esper ディレクトリで mvn コマンド実行)
サンプルの作成
動作確認のために Java で作成するのも面倒なので Groovy でサンプルを作成する事にした。
今回使用した Esper コンポーネント(camel-esper)の URI フォーマットは以下の通り。
esper:name esper:name?eql=EPLクエリ
なお、Esper 2.3.0 の EPL(Event Proccesing Language)は Esper 1.11.0 では EQL と呼ばれていたみたいなので "eql=" というオプション記述を使う事になる。
test_esper.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("direct:start").to("esper:test") //value が 5以上の TestEvent のみを出力対象とする from("esper:test?eql=select * from TestEvent(value >= 5)").process({println "process ${it.in.body.name}"} as Processor) } } //イベントクラス class TestEvent { String name int value } ctx = new DefaultCamelContext() ctx.addRoutes(new SampleRoute()) template = ctx.createProducerTemplate() println "start" ctx.start() (1..10).each { //value が 1 から 10 までの TestEvent を送出する template.sendBody("direct:start", new TestEvent(name: "test${it}", value: it)) } ctx.stop() println "stop"
サンプルの実行
以下の JAR ファイルがクラスパスに含まれるようにして(Groovy の conf/groovy-starter.conf に設定する等)、サンプルを実行する。
- Apache Camel 1.5.0 内の JAR ファイル
- Esper 2.3.0 内の JAR ファイル
- Esper 2.3.0 対応を施した camel-esper.jar ファイル
実行
>groovy test_esper.groovy start process test5 process test6 process test7 process test8 process test9 process test10 stop
上記のような実行結果となり、一応 Camel 上で Esper が機能している事を確認できる。