コード例 #1
0
        private async Task ProcessEvent <TService>(string msgText, IBasicProperties basicProperties, IEnumerable <TService> svcs)
            where TService : class
        {
            //var eventName = orginalMsg.RoutingKey;
            var type = typeof(TService);
            var msg  = QuRegulation.Transfer.ToObject <QuMsg>(msgText);
            //type.GetInterfaces

            var methodInfo = type.FindIncludBaseType <MethodInfo>(t => t.GetMethod(msg.MethodName));

            var paramInfos   = methodInfo.GetParameters();
            var methodparams = new object[paramInfos.Length];

            for (int i = 0; i < paramInfos.Length; i++)
            {
                var paramType = paramInfos[i].ParameterType;
                var jobject   = msg.Params[i] as JObject;
                methodparams[i] = (jobject == null)? msg.Params[i]: jobject.ToObject(paramType);
            }
            foreach (var svc in svcs)
            {
                //methodInfo.Invoke(svc, methodparams);
                if (string.IsNullOrEmpty(basicProperties.ReplyTo))
                {
                    await Task.Run(() => methodInfo.Invoke(svc, methodparams)).ConfigureAwait(false);
                }
                else
                {
                    object rlt = await Task <object> .Run(() => methodInfo.Invoke(svc, methodparams)).ConfigureAwait(false);

                    //IQuCorrleation quRlt = (typeof(IQuCorrleation).IsAssignableFrom(methodInfo.ReturnType))
                    //    ? rlt as IQuCorrleation
                    //    : new QuResult<object>(rlt);
                    //quRlt.CorrleationId= orginalMsg.BasicProperties.CorrelationId;
                    rlt = (typeof(QuResult).IsAssignableFrom(methodInfo.ReturnType)) ? ((QuResult)rlt).Value :rlt;
                    QuMsg repMsg = new QuMsg(new object[] { basicProperties.CorrelationId, rlt });
                    //repMsg.CorrleationId = orginalMsg.BasicProperties.CorrelationId;
                    repMsg.MethodName = nameof(IQuResponseService.ReceiveResponse);
                    //Channel.QueueDeclare(orginalMsg.BasicProperties.ReplyTo, queueSpec.Durable, queueSpec.Exclusive, queueSpec.AutoDelete, null);
                    var rspMessage = QuRegulation.Transfer.ToText(repMsg);//JsonConvert.SerializeObject(msg);
                    var body       = Encoding.UTF8.GetBytes(rspMessage);
                    using (var channel = Conn.Entity.Create())
                        channel.Entity.BasicPublish("", basicProperties.ReplyTo, null, body);
                }
            }
        }
コード例 #2
0
ファイル: QuProxy.cs プロジェクト: ginnfeng/eShopOnContainers
        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);
        }