public object BlockingRMIRequest(NodeRMI rmi) { //Find the target node var targetNode = HostClient.Instance.NodeForId(rmi.NodeID); if (targetNode == null) throw new NodeNotExistException(); using (var ms = new MemoryStream()) { Serializer.Serialize(ms, rmi); HostClient.Instance.Send(HostClient.Instance.BuildMessage(MessageIdentifier.RMIInvoke, ms.ToArray(), true)); } var returnType = targetNode.RMIResolvedType.GetMethod(rmi.MethodName).ReturnType; if (returnType == typeof(void)) return null; //Wait for a response int time = 0; while (!rmiResponses.ContainsKey(rmi.RequestID)) { Thread.Sleep(50); time++; if (time > 400) throw new NodeRMITimeoutException(); } var response = rmiResponses[rmi.RequestID]; rmiResponses.Remove(rmi.RequestID); return response.DeserializeReturnValue(); }
public void ProcessRMI(NodeRMI rmi) { var nodeInstance = Nodes.Keys.FirstOrDefault(e => e.Id == rmi.NodeID); if (nodeInstance == null) return; var instance = Nodes[nodeInstance]; //Find the method var method = nodeInstance.RMIResolvedType.GetMethod(rmi.MethodName); var result = method.Invoke(instance, rmi.DeserializeArguments()); if (method.ReturnType == typeof(void)) return; rmi.SerializeReturnValue(result); HostClient.Instance.ProcessRMIResponse(rmi); }
/// <summary> /// Route a RMI request to the host with the target node /// </summary> /// <param name="rmi"></param> /// <param name="destoNode"> </param> public void RouteRMIRequest(NodeRMI rmi, NodeInfo destoNode) { if(destoNode.HostID.Length == 1) { rmi.SerializeReturnValue(destoNode.RMIResolvedType.GetMethod(rmi.MethodName).Invoke(controller, rmi.DeserializeArguments())); RouteRMIResponse(rmi); return; } var destoHost = HostCache.FindHost(destoNode.HostID); SendTo(destoHost.Info, destoHost.BuildMessage(MessageIdentifier.RMIInvoke, rmi.Serialize())); }
/// <summary> /// Route a RMI response to the host. /// </summary> /// <param name="rmi"></param> public void RouteRMIResponse(NodeRMI rmi) { var target = NodePool.Instance.NodeForId(rmi.SNodeID); if(target == null) { log.Debug("RMI response "+rmi.RequestID+" dropped as the initiator doesn't exist anymore."); return; } var targetHost = HostCache.FindHost(target.HostID); SendTo(targetHost.Info, targetHost.BuildMessage(MessageIdentifier.RMIResponse, rmi.Serialize())); }