Groovy で Dempsy を単独実行2 - KeySource
前回に続き、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 を設定したClusterDefinition
へsetKeySource()
で設定
なお、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 のアクティブ化タイミング |
---|---|
無 | 新しくキーが発生する度 |
有 | 起動時 |