private IQuCorrleation RegistQuReslut(MethodInfo methodInfo, QuSpecAttribute queueSpec, QuMsg msg, out bool immediatelyWaitRasult) { immediatelyWaitRasult = !typeof(IQuCorrleation).IsAssignableFrom(methodInfo.ReturnType); //if (immediatelyWaitRasult) return null; //var type=typeof(QuResult<>).MakeGenericType(methodInfo.ReturnType.GetGenericArguments()); IQuCorrleation quRlt = (immediatelyWaitRasult)?new QuResult(): Activator.CreateInstance(methodInfo.ReturnType) as IQuCorrleation; quRlt.CorrleationId = string.IsNullOrEmpty(msg.CorrleationId)?msg.Id:msg.CorrleationId; //quResultMap ??= new Dictionary<string, IQuCorrleation>(); //lock (this) // quResultMap[quRlt.CorrleationId] = quRlt; return(quRlt); }
private object DispatchMethod(IModel channel, MethodInfo methodInfo, ref object[] args) { QuSpecAttribute queueSpec; if (!queueOfMethodMap.TryGetValue(methodInfo, out queueSpec)) { queueSpec = QuRegulation <TService> .TakeQueueSpec(methodInfo); queueOfMethodMap[methodInfo] = queueSpec; } var msg = CreateQueueMessage(methodInfo, args); var targetQueue = string.IsNullOrEmpty(msg.TargetQueue) ? queueSpec.Queue : msg.TargetQueue; var replyQueue = string.IsNullOrEmpty(msg.ReplyQueue) ? queueSpec.ReplyQueue : msg.ReplyQueue; IQuCorrleation quRlt = null; IBasicProperties props = null; bool immediatelyWaitRasult = false; bool noReturn = methodInfo.ReturnType.Equals(typeof(void)); if (!noReturn) { quRlt = RegistQuReslut(methodInfo, queueSpec, msg, out immediatelyWaitRasult); if (quRlt != null) { props = channel.CreateBasicProperties(); props.ReplyTo = queueSpec.ReplyQueue; props.CorrelationId = quRlt.CorrleationId; } } channel.QueueDeclare(targetQueue, queueSpec.Durable, queueSpec.Exclusive, queueSpec.AutoDelete, null); var message = QuRegulation.Transfer.ToText(msg);//JsonConvert.SerializeObject(msg); var body = Encoding.UTF8.GetBytes(message); if (quRlt != null) { responseService.Register(quRlt); StartListeningReslutQueue(replyQueue); } channel.BasicPublish("", targetQueue, props, body); if (noReturn || quRlt == null) { return(null); } if (immediatelyWaitRasult) { var obj = responseService.Wait(methodInfo.ReturnParameter.ParameterType, quRlt, defaultWaitTimeout); return(obj); } return(quRlt); //return Activator.CreateInstance(methodInfo.ReturnParameter.ParameterType); }
public void Register(IQuCorrleation rlt) { QuResultHandler rltHlper; lock (this) { if (!rltmap.TryGetValue(rlt.CorrleationId, out rltHlper)) { rltHlper = new QuResultHandler(rlt.CorrleationId); rltmap[rlt.CorrleationId] = rltHlper; } } rltHlper.StartWatch(); }
public object Wait(Type retType, IQuCorrleation rltStamp, TimeSpan timeOut) { QuResultHandler rltHlper; lock (this) { if (!rltmap.TryGetValue(rltStamp.CorrleationId, out rltHlper)) { throw new NullReferenceException(nameof(Wait)); } } var obj = rltHlper.Wait(timeOut); var jObj = obj as JObject; var rlt = (jObj != null) ? jObj.ToObject(retType) : obj; lock (this) rltmap.Remove(rltHlper.CorrleationId); rltHlper.Dispose(); return(rlt); }