Ejemplo n.º 1
0
        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);
        }
Ejemplo n.º 2
0
        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);
        }
Ejemplo n.º 3
0
        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();
        }
Ejemplo n.º 4
0
        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);
        }