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 用に改造した上で使用する。

今回使用した環境は以下の通り。

  • Java SE 6 Update 10
  • Groovy 1.6 beta 2
  • Apache Camel 1.5.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 は融通が利かない気がするので苦手)

  1. .m2/repository/esper/esper/2.3.0 に esper-2.3.0.jar を手動で配置
  2. camel-extra/components/camel-esper/pom.xml ファイル内の Esper のバージョン設定を 1.11.0 から 2.3.0 に変更
  3. camel-extra/components/camel-esper/src/test/java/org/apache/camel/component/esper/EsperRouteTest.java を削除(テストフェーズをスキップさせるため)
  4. 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 が機能している事を確認できる。