goo blog サービス終了のお知らせ 

P2Pとかプログラミング全般とか

P2Pアプリ開発を目指していこうかと。
基本、週末更新なので遅々として進まず。

メッセージを受け取るには

2008-02-20 22:45:18 | Overlay Weaver
忘れてた。メッセージを受け取る方法を書いておかねば。
ow.messaging.MessageHandler インターフェイスを実装したクラスをメッセージの
タグ番号と共に登録することで、メッセージ受信時にコールバックされる。
ow.dht.DHT のインスタンスを dht、MessageHandler のインスタンスを handler とすると、
 dht.getRoutingService().addMessageHandler(tag, handler);
で登録できる。もちろん tag は 0 以上 255 以下だ。

実際には、Map<Integer, List<MessageHandler>> 型の ow.routing.impl.AbstractRoutingDriver.handlerTable 変数に
格納される。つまり1つのタグ値に対して複数の MessageHandler を登録できる。
ただ、ここの実装がちょっと微妙。登録された MessageHandler は、
ow.routing.impl.AbstractRoutingDriver.RoutingDrvMessageHandler.process
メソッドで振り分け処理がなされて呼び出されるんだけど、複数の MessageHandler
がある場合、最後に登録されたハンドラの process メソッドの戻り値を
メッセージの送信元に返すことになる。これだと、最初に登録されたハンドラの
戻り値を返したい、後から登録したハンドラはイベントドリブンのトリガに使いたい
だけ、って時に困る。最初の戻り値を潰す事になるからだ。
たとえば dht.put されたこと(つまり自ノードに put データが来たこと)を
知りたくて ow.messaging.Tag.PUT.getNumber() に addMessageHandler した場合、
本来のハンドラ ow.dht.impl.StandardDHTImpl.PutMessageHandler.process は
DHTMessageFactory.getDHTReplyMessage() の戻り値を put の返答として返すん
だけど、後から登録したハンドラの戻り値に潰されてしまう。
なので、できれば MessageHandler.process の戻り値が null の場合は前のハンドラ
の戻り値を使用する(潰さない)ようにしてほしいなぁ、と。
その旨を Sourceforge の Feature Requests にこっそり匿名で書いといたんだけど、
返事なし。仕方ないので、メッセージ到着を検知したい場合は自分でソースを書き換えよう。