プロトコルスタック その2
昨日よくわからなかったのでソースを追う.
まずはじめにこれがJGroups APIを使う場合の基本形.チャンネルを作って接続,切断.
JChannel channel = new JChannnel("file://home/mir/default.xml"); channel.connect("demo-group"); channel.disconnect(); channel.close();
何も設定情報を与えないとデフォルトの設定が使用される.
public static final String DEFAULT_PROTOCOL_STACK= "UDP(mcast_addr=228.1.2.3;mcast_port=45566;ip_ttl=32):" + "PING(timeout=3000;num_initial_members=6):" + "FD(timeout=3000):" + "VERIFY_SUSPECT(timeout=1500):" + "pbcast.NAKACK(gc_lag=10;retransmit_timeout=600,1200,2400,4800):" + "UNICAST(timeout=600,1200,2400,4800):" + "pbcast.STABLE(desired_avg_gossip=10000):" + "FRAG:" + "pbcast.GMS(join_timeout=5000;join_retry_timeout=2000;" + "shun=true;print_local_addr=true)";
で,ここから先の呼び出し経路をソース引用しつつエントリを書いていたのだけれども引用ソースの量が半端なく多くなってきたのでソースは割愛.
ソースから確認できたこと.
new JChannnel()において
- JChannelのコンストラクタに渡されたプロトコルスタック設定情報を解析.XMLとプレーンテキストの双方に対応.内部的には一度プレーンテキストに纏められる.
- XMLの場合は各プロトコル設定はconfig要素の下に,要素として記述する.
- プレーンテキストの場合は各プロトコルの設定をコロン":"で分けて記述する.
- プレーンテキストの場合は"プロトコル名(属性A=値;属性B=値)"の形式で書く.
- プロトコルスタック設定情報は各プロトコル毎に分割され,それぞれの情報を使ってプロトコル名とそれぞれの属性Key&valueを持ったProtocolConfigurationオブジェクトが設定されたプロトコルの数だけ生成される.
- プロトコル実装クラスは"org.jgroups.protocol"パッケージのクラスである必要がある.JavaDocを参照.プロトコル名は"[サブパッケージ名.]クラス名"である.
- "org.jgroups.protocol.${プロトコル名}"のクラスをクラスローダを使ってロードし,リフレクションによりインスタンスの生成を行う.
- プロトコル実装クラスは"org.jgroups.protocol.Protocol"クラスを継承.
- プロトコルに属性設定が無い場合には単に初期化(initメソッド呼び出し)するだけ,属性設定がある場合にはプロパティを分解した上で初期化.
- 作成したProtocol実装インスタンスをレイヤーに追加(Vectorに追加)
- 同じ名前のプロトコルが重複して使われていないかどうかチェック,各プロトコル間での依存性をチェック(各プロトコル実装のup_serviceとかdown_serviceとかを参照).
- プロトコルスタック内の各プロトコルにそれぞれ上下のプロトコルへの参照を設定する.
- 一番上のレイヤーのプロトコルの上にプロトコルスタックへの参照を設定する.
- 一番下のレイヤーのプロトコルのDownHandlerとUpHandlerを開始する(up_threadあるいはdown_threadがtrueの場合,各プロトコル次第).
- 各HandlerはThreadのサブクラス.startメソッドによりスレッドが起動する.
コンストラクタはここまで,一番下のプロトコル以外何もしないらしい.
読み始めてから途中外出を挟んで結構時間がかかってしまったので,とりあえずはここまでをBlogにアップしておく.あとJChannel.connect(),JChannel.send(Message),JChannel.receive(long)を読むつもり.