読者です 読者をやめる 読者になる 読者になる

Groovy で Dempsy を単独実行2 - KeySource

Groovy CEP

前回に続き、Dempsy を Groovy で単独実行してみます。 今回は KeySource の設定有無でどのように挙動が変わるかを簡単に調べます。

サンプルソースは http://github.com/fits/try_samples/tree/master/blog/20131201/

KeySource 無しの場合

まず、前回サンプルの Adaptor クラスを変更し、http://localhost:8080/<金額> へのアクセスがあった際に Dispatcher へメッセージを dispatch() するように変更しました。 (HTTP サーバー処理は Vert.x を組み込み実行)

また、outputExecuter に RelativeOutputSchedule を設定し 10秒毎にカウント値を出力するように変更しています。

money_count_vertx.groovy
・・・
class Constants {
    final static def MONEYS = [
        '1', '5', '10', '50', '100', '500', '1000', '2000', '5000', '10000'
    ]
}

class MoneyAdaptor implements Adaptor {
    Dispatcher dispatcher

    void start() {
        println 'MoneyAdaptor.start ...'

        def vertx = Vertx.newVertx()

        def rm = new RouteMatcher()
        rm.get '/:money', { req ->
            def money = req.params['money']

            if (Constants.MONEYS.contains(money)) {
                dispatcher.dispatch(new Money(req.params['money']))
            }
            req.response.end()
        }

        vertx.createHttpServer().requestHandler(rm.asClosure()).listen 8080
    }

    void stop() {
        println 'MoneyAdaptor.stop'
    }
}

def mp = new ClusterDefinition('mp', new MoneyCount())
mp.outputExecuter = new com.nokia.dempsy.output.RelativeOutputSchedule(10, java.util.concurrent.TimeUnit.SECONDS)

def app = new ApplicationDefinition('money-count').add(
    new ClusterDefinition('adaptor', new MoneyAdaptor()),
    mp
)
・・・

実行

それでは実行します。

出力1
> groovy money_count_vertx.groovy
・・・
MoneyAdaptor.start ...

MoneyAdaptor が start しただけで、MoneyCount は 1つもアクティブ化されていない状態です。

ここで http://localhost:8080/5 へアクセスすると、キー値 5 を処理する MoneyCount がアクティブ化され、10秒毎に現在のカウント値が出力されるようになります。

出力2
MoneyCount.activation : 5
key: 5, count: 1

この後、http://localhost:8080/5 へアクセスするたびにカウントアップされます。

次に、http://localhost:8080/10000 へアクセスするとキー値 10000 を処理する新しい MoneyCount がアクティブ化されます。

出力3
MoneyCount.activation : 10000
key: 10000, count: 1
key: 5, count: 4

このように、KeySource を設定しなかった場合は新しくキーが発生する度に MessageProcessor の新しいインスタンスがアクティブ化されます。

KeySource 有りの場合

次に、KeySource を設定してみます。 KeySource を設定するには下記のようにします。

  • KeySource インターフェースの実装オブジェクトを MessageProcessor を設定した ClusterDefinitionsetKeySource() で設定

なお、KeySource インターフェースは getAllPossibleKeys() で全てのキーを返すように実装します。

変更点は下記のようになります。

money_count_vertx_ks.groovy
・・・
def mp = new ClusterDefinition('mp', new MoneyCount()).setKeySource({
    Constants.MONEYS
} as KeySource<String>)
・・・

実行

それでは実行します。

出力1
> groovy money_count_vertx_ks.groovy
・・・
MoneyAdaptor.start ...
MoneyCount.activation : 1
MoneyCount.activation : 5
MoneyCount.activation : 10
MoneyCount.activation : 50
MoneyCount.activation : 100
MoneyCount.activation : 500
MoneyCount.activation : 1000
MoneyCount.activation : 2000
MoneyCount.activation : 5000
MoneyCount.activation : 10000

KeySource を設定しなかった場合とは異なり、起動時に全キーの MoneyCount がアクティブ化されます。

http://localhost:8080/5 等へアクセスすると該当キーがカウントアップされます。

出力2
key: 1, count: 0
key: 100, count: 0
key: 10000, count: 1
key: 500, count: 0
key: 1000, count: 0
key: 2000, count: 0
key: 5, count: 4
key: 5000, count: 0
key: 10, count: 0
key: 50, count: 0

まとめ

簡単にまとめると下記のようになります。

KeySource の設定 MessageProcessor のアクティブ化タイミング
新しくキーが発生する度
起動時