検証用Protocolを実装
少しだけ時間が取れたのでJGroupsの一人ソース輪読会の続きをやった.
がしかし,読んでいてこんがらかってきたので,ある手法で動きを調べてみることに.
ある手法とは,こんな感じのSystem.out.println()ログ出力プロトコルを実装してJGroupsを動かしてみること.
public class MIR extends Protocol { public String getName() { return "MIR"; } public void destroy() { System.out.println("MIR.destroy()"); super.destroy(); } public void down(Event evt) { System.out.println("MIR.down(" + evt + ")"); super.down(evt); } public Protocol getDownProtocol() { System.out.println("MIR.getDownProtocol() returns " + super.getDownProtocol()); return super.getDownProtocol(); } ...略 }
呼び出し元のmainメソッドは以下.
public static final String STACK2 = "UDP(mcast_addr=228.1.2.3;mcast_port=45566;ip_ttl=32):" + "MIR"; public static void main(String[] args) throws Exception { System.out.println("\n----- start new JChannel() -----\n"); JChannel channel = new JChannel(STACK2); System.out.println("\n----- start channel.connect() -----\n"); channel.connect("demo-group"); System.out.println("\n----- start channel.disconnect() -----\n"); channel.disconnect(); System.out.println("\n----- start channel.close() -----\n"); channel.close(); System.out.println("\n----- main method end -----\n"); }
最下層レイヤーにはUDPのようなProtocolを設定しておかないと上手く動かないので,MIR+UDPの2層構成にて.
設定ファイル上での上下関係は動作時の上下関係とは逆になる.
以下のログが出力された.
----- start new JChannel() ----- MIR.setProtocolStack(org.jgroups.stack.ProtocolStack@32fb4f) MIR.setProperties({}) returns true MIR.setPropertiesInternal({}) returns true MIR.init() MIR.requiredUpServices() returns null MIR.requiredDownServices() returns null MIR.providedUpServices() returns null MIR.providedDownServices() returns null MIR.setDownProtocol(Protocol UDP(local address: null)) MIR.setUpProtocol(org.jgroups.stack.ProtocolStack@32fb4f) MIR.getDownProtocol() returns Protocol UDP(local address: null) MIR.startDownHandler() MIR.startUpHandler() MIR.getUpProtocol() returns org.jgroups.stack.ProtocolStack@32fb4f ----- start channel.connect() ----- MIR.(protected) receiveDownEvent(Event[type=START, arg=null]) MIR.(protected) handleSpecialDownEvent(Event[type=START, arg=null]) MIR.start() MIR.down(Event[type=START, arg=null]) MIR.passDown(Event[type=START, arg=null]) MIR.(protected) receiveUpEvent(Event[type=SET_LOCAL_ADDRESS, arg=192.168.1.100:2319]) MIR.up(Event[type=SET_LOCAL_ADDRESS, arg=192.168.1.100:2319]) MIR.passUp(Event[type=SET_LOCAL_ADDRESS, arg=192.168.1.100:2319]) MIR.(protected) receiveUpEvent(Event[type=START_OK, arg=true]) MIR.up(Event[type=START_OK, arg=true]) MIR.passUp(Event[type=START_OK, arg=true]) MIR.(protected) receiveDownEvent(Event[type=CONNECT, arg=demo-group]) MIR.down(Event[type=CONNECT, arg=demo-group]) MIR.passDown(Event[type=CONNECT, arg=demo-group]) MIR.(protected) receiveUpEvent(Event[type=CONNECT_OK, arg=null]) MIR.up(Event[type=CONNECT_OK, arg=null]) MIR.passUp(Event[type=CONNECT_OK, arg=null]) ----- start channel.disconnect() ----- MIR.(protected) receiveDownEvent(Event[type=DISCONNECT, arg=192.168.1.100:2319]) MIR.down(Event[type=DISCONNECT, arg=192.168.1.100:2319]) MIR.passDown(Event[type=DISCONNECT, arg=192.168.1.100:2319]) MIR.(protected) receiveUpEvent(Event[type=DISCONNECT_OK, arg=null]) MIR.up(Event[type=DISCONNECT_OK, arg=null]) MIR.passUp(Event[type=DISCONNECT_OK, arg=null]) MIR.(protected) receiveDownEvent(Event[type=STOP_QUEUEING, arg=null]) MIR.(protected) receiveDownEvent(Event[type=STOP, arg=null]) MIR.down(Event[type=STOP_QUEUEING, arg=null]) MIR.passDown(Event[type=STOP_QUEUEING, arg=null]) MIR.(protected) handleSpecialDownEvent(Event[type=STOP, arg=null]) MIR.stop() MIR.down(Event[type=STOP, arg=null]) MIR.passDown(Event[type=STOP, arg=null]) MIR.(protected) receiveUpEvent(Event[type=STOP_OK, arg=true]) MIR.up(Event[type=STOP_OK, arg=true]) MIR.passUp(Event[type=STOP_OK, arg=true]) ----- start channel.close() ----- MIR.stopInternal() MIR.destroy() MIR.getDownProtocol() returns Protocol UDP(local address: 192.168.1.100:2319) ----- main method end -----
続きはまた後日.