gms.java.rmi
来自「JGRoups源码」· RMI 代码 · 共 220 行
RMI
220 行
/* Todo: - Discard messages from members not in our current view (?)*/package JavaGroups.JavaStack.Protocols;import java.util.*;import JavaGroups.*;import JavaGroups.JavaStack.*;public class GMS extends Protocol implements Transportable { private final int type=Conf.GMS_MSG; private Properties props=null; private GmsImpl gms_impl=null; private MethodInvoker method_invoker=new MethodInvoker(this, false); private String channel_name=null; private Queue rsp_queue=new Queue(); private String gossip_host=null; private int gossip_port=0; private GossipClient gossip=null; private boolean gossiping=false; public GMS() { method_invoker.SetMethodLookup(new MethodLookupClos()); gms_impl=new GmsImpl(this); method_invoker.AddTargetObject(gms_impl); } public ProtocolStack GetProtocolStack() {return stack;} public String GetName() {return "GMS";} public boolean UseGossip() {return gossiping;} public Vector FindInitialMembers(String channel_name) { if(gossip != null) return gossip.Get(channel_name); return new Vector(); } public void Join(Oid new_member) { gms_impl.Join(new_member); } public void Leave(Oid member) { gms_impl.Leave(member); } /*-------------------------- Interface Transportable -------------------------------*/ /** Used e.g. by MethodInvoker to return a response. Tag the message with our type. */ public void Send(Message msg) throws Exception { if(msg.GetDest() == null) msg.SetDest(new Oid(channel_name, type)); else ((Oid)msg.GetDest()).SetType(type); Down(new Event(Event.MSG, msg)); } /** Remove a message from the rsp_queue */ public Message Receive(long timeout) throws Exception { try { return (Message)rsp_queue.Remove(timeout); } catch(TimeoutException tex) { throw tex; } catch(QueueClosed closed) { return null; } catch(Exception e) { System.err.println("GMS.Receive(): " + e); } return null; } /*----------------------------------------------------------------------------------*/ /*------------------------------- Interface Protocol -------------------------------*/ /** * In case of a request, forward the message to the method invoker. In case of a response, * put it on the response queue, to be retrieved by later Receive() calls. */ public void Up(Event evt) { int msg_type; Message msg; Header hdr; if(evt.GetType() != Event.MSG) { PassUp(evt); return; } msg=(Message)evt.GetArg(); hdr=msg.RemoveHeader(); try { msg_type=((Oid)msg.GetDest()).GetType(); if(msg_type == type) { if(msg.IsResponse()) rsp_queue.Add(msg); else method_invoker.Receive(msg); return; } PassUp(evt); } catch(Exception e) { System.err.println(e); } } public void Down(Event evt) { Message msg; if(evt.GetType() != Event.MSG) { HandleDownEvent(evt); return; } msg=(Message)evt.GetArg(); msg.AddHeader(new Header(gms_impl.GetViewId())); PassDown(evt); } private void HandleDownEvent(Event evt) { switch(evt.GetType()) { case Event.JOIN: gms_impl.StartJoin(); break; case Event.LEAVE: gms_impl.StartLeave((Oid)evt.GetArg()); PassUp(new Event(Event.LEAVE_OK)); break; default: PassDown(evt); } } public void StartWork() { Address local_addr; if(stack != null) channel_name=stack.GetChannelName(); if(gms_impl == null) { System.err.println("GMS.StartWork(): gms_impl is null"); return; } if(gossiping) { if(gossip == null) { gossip=new GossipClient(stack.GetChannelName(), gossip_host, gossip_port); local_addr=stack != null ? stack.GetLocalAddress() : null; if(local_addr != null) gossip.SetAddress(new Oid(local_addr, stack.GetChannelName())); else System.err.println("GMS.StartWork(): starting gossip client, but local " + "address is null !"); gossip.Start(); } } } public void StopWork() { if(gossip != null) { gossip.Stop(); gossip=null; } } /** Setup the Protocol instance acording to the configuration string */ public void SetProperties(Properties props) { String str; this.props=props; str=props.getProperty("gossip_host"); if(str != null) gossip_host=new String(str); str=props.getProperty("gossip_port"); if(str != null) gossip_port=new Integer(str).intValue(); if(gossip_host != null && gossip_port != 0) gossiping=true; } public String toString() { return "Protocol GMS"; } /*----------------------------------------------------------------------------------*/}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?