示例#1
0
 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();
 }
示例#2
0
        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);
        }
示例#3
0
 /// <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()));
 }
示例#4
0
 /// <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()));
 }