public override void OnExecuted(ExecutedContext result)
 {
     if (result.Args.FirstOrDefault() != null)
     {
         result.Args[0] = result.Args[0].ToString() + "Hello";
         Console.Write(result.Args[0]);
     }
 }
Example #2
0
        public void Init()
        {
            Mock <MethodInfo> moqmethodInfo = new Mock <MethodInfo>();
            var args = new object[] { "12345!!##,,11dasd" };

            moqmethodInfo.Setup(o => o.Name).Returns("Test_ExecutedContext");

            _executedContext = new ExecutedContext(moqmethodInfo.Object, args, It.IsAny <object>());
            _executing       = new ExecutingContext(moqmethodInfo.Object, args);
        }
        public void Init()
        {
            Mock <IMethodCallMessage>   moqCallMessage   = new Mock <IMethodCallMessage>();
            Mock <IMethodReturnMessage> moqReturnMessage = new Mock <IMethodReturnMessage>();

            moqCallMessage.Setup(o => o.Args).Returns(new object[] { "12345!!##,,11dasd" });
            moqCallMessage.Setup(o => o.MethodName).Returns("Test_ExecutedContext");
            moqReturnMessage.Setup(o => o.ReturnValue).Returns(It.IsAny <object>);

            _executedContext = new ExecutedContext(moqReturnMessage.Object);
            _executing       = new ExecutingContext(moqCallMessage.Object);
        }
Example #4
0
        public async Task<ConsumerExecutedResult> InvokeAsync(ConsumerContext context, CancellationToken cancellationToken = default)
        {
            cancellationToken.ThrowIfCancellationRequested();

            var methodInfo = context.ConsumerDescriptor.MethodInfo;
            var reflectedTypeHandle = methodInfo.ReflectedType.TypeHandle.Value;
            var methodHandle = methodInfo.MethodHandle.Value;
            var key = $"{reflectedTypeHandle}_{methodHandle}";

            var executor = _executors.GetOrAdd(key, x => ObjectMethodExecutor.Create(methodInfo, context.ConsumerDescriptor.ImplTypeInfo));

            using var scope = _serviceProvider.CreateScope();

            var provider = scope.ServiceProvider;

            var obj = GetInstance(provider, context);

            var message = context.DeliverMessage;
            var parameterDescriptors = context.ConsumerDescriptor.Parameters;
            var executeParameters = new object[parameterDescriptors.Count];
            for (var i = 0; i < parameterDescriptors.Count; i++)
            {
                var parameterDescriptor = parameterDescriptors[i];
                if (parameterDescriptor.IsFromCap)
                {
                    executeParameters[i] = GetCapProvidedParameter(parameterDescriptor, message, cancellationToken);
                }
                else
                {
                    if (message.Value != null)
                    {
                        if (_serializer.IsJsonType(message.Value))  // use ISerializer when reading from storage, skip other objects if not Json
                        {
                            executeParameters[i] = _serializer.Deserialize(message.Value, parameterDescriptor.ParameterType);
                        }
                        else
                        {
                            var converter = TypeDescriptor.GetConverter(parameterDescriptor.ParameterType);
                            if (converter.CanConvertFrom(message.Value.GetType()))
                            {
                                executeParameters[i] = converter.ConvertFrom(message.Value);
                            }
                            else
                            {
                                if (parameterDescriptor.ParameterType.IsInstanceOfType(message.Value))
                                {
                                    executeParameters[i] = message.Value;
                                }
                                else
                                {
                                    executeParameters[i] = Convert.ChangeType(message.Value, parameterDescriptor.ParameterType);
                                }
                            }
                        }
                    }
                }
            }

            var filter = provider.GetService<ISubscribeFilter>();
            object resultObj = null;
            try
            {
                if (filter != null)
                {
                    var etContext = new ExecutingContext(context, executeParameters);
                    filter.OnSubscribeExecuting(etContext);
                    executeParameters = etContext.Arguments;
                }

                resultObj = await ExecuteWithParameterAsync(executor, obj, executeParameters);

                if (filter != null)
                {
                    var edContext = new ExecutedContext(context, resultObj);
                    filter.OnSubscribeExecuted(edContext);
                    resultObj = edContext.Result;
                }
            }
            catch (Exception e)
            {
                if (filter != null)
                {
                    var exContext = new ExceptionContext(context, e);
                    filter.OnSubscribeException(exContext);
                    if (!exContext.ExceptionHandled)
                    {
                        throw exContext.Exception;
                    }

                    if (exContext.Result != null)
                    {
                        resultObj = exContext.Result;
                    }
                }
                else
                {
                    throw;
                }
            }

            return new ConsumerExecutedResult(resultObj, message.GetId(), message.GetCallbackName());
        }
 public override void OnExecuted(ExecutedContext result)
 {
 }
        public void OnExecuted(ExecutedContext context)
        {
            var resultJson = JsonConvert.SerializeObject(context.Result);

            _log.WriteLog($"ExecuteAfter: {resultJson}");
        }
Example #7
0
 public void OnSubscribeExecuted(ExecutedContext context)
 {
     _logger.LogInformation(
         $"^^^^^^^^^^^^^^^^^^^^^^^^^^{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")}###订阅收到消息处理结束  Name:{context.DeliverMessage.Headers["cap-msg-name"]} Id:{context.DeliverMessage.Headers["cap-corr-id"]}");
 }
Example #8
0
 /// <summary>
 /// 執行後攔截方法
 /// </summary>
 /// <param name="result"></param>
 public virtual void OnExecuted(ExecutedContext context)
 {
 }
Example #9
0
 /// <summary>
 /// Called after the subscriber executes.
 /// </summary>
 /// <param name="context">The <see cref="ExecutedContext"/>.</param>
 public virtual void OnSubscribeExecuted(ExecutedContext context)
 {
 }
        /// <summary>
        /// 调用订阅者方法
        /// </summary>
        /// <param name="context"></param>
        /// <param name="cancellationToken"></param>
        /// <returns></returns>
        public virtual async Task <ConsumerExecutedResult> InvokeAsync(ConsumerContext context, CancellationToken cancellationToken = default)
        {
            cancellationToken.ThrowIfCancellationRequested();

            var methodInfo    = context.ConsumerDescriptor.MethodInfo;
            var reflectedType = methodInfo.ReflectedType.Name;

            _logger.LogDebug("Executing subscriber method : {0}", methodInfo.Name);

            var key      = $"{methodInfo.Module.Name}_{reflectedType}_{methodInfo.MetadataToken}";
            var executor = _executors.GetOrAdd(key, x => ObjectMethodExecutor.Create(methodInfo, context.ConsumerDescriptor.ImplTypeInfo));

            using var scope = _serviceProvider.CreateScope();

            var provider = scope.ServiceProvider;

            var obj = GetInstance(provider, context);

            var message = context.DeliverMessage;
            var parameterDescriptors = context.ConsumerDescriptor.Parameters;
            var executeParameters    = new object[parameterDescriptors.Count];
            // 租户数据可能在消息标头中
            var tenantId = message.GetTenantIdOrNull();

            for (var i = 0; i < parameterDescriptors.Count; i++)
            {
                if (parameterDescriptors[i].IsFromCap)
                {
                    executeParameters[i] = new CapHeader(message.Headers);
                }
                else
                {
                    if (message.Value != null)
                    {
                        if (_serializer.IsJsonType(message.Value))  // use ISerializer when reading from storage, skip other objects if not Json
                        {
                            var eventData = _serializer.Deserialize(message.Value, parameterDescriptors[i].ParameterType);
                            // 租户数据也可能存在事件数据中
                            if (tenantId == null && eventData is IMultiTenant tenant)
                            {
                                tenantId = tenant.TenantId;
                            }
                            executeParameters[i] = eventData;
                        }
                        else
                        {
                            var converter = TypeDescriptor.GetConverter(parameterDescriptors[i].ParameterType);
                            if (converter.CanConvertFrom(message.Value.GetType()))
                            {
                                var eventData = converter.ConvertFrom(message.Value);
                                // 租户数据也可能存在事件数据中
                                if (tenantId == null && eventData is IMultiTenant tenant)
                                {
                                    tenantId = tenant.TenantId;
                                }
                                executeParameters[i] = eventData;
                            }
                            else
                            {
                                if (parameterDescriptors[i].ParameterType.IsInstanceOfType(message.Value))
                                {
                                    // 租户数据也可能存在事件数据中
                                    if (tenantId == null && message.Value is IMultiTenant tenant)
                                    {
                                        tenantId = tenant.TenantId;
                                    }
                                    executeParameters[i] = message.Value;
                                }
                                else
                                {
                                    var eventData = Convert.ChangeType(message.Value, parameterDescriptors[i].ParameterType);
                                    // 租户数据也可能存在事件数据中
                                    if (tenantId == null && eventData is IMultiTenant tenant)
                                    {
                                        tenantId = tenant.TenantId;
                                    }
                                    executeParameters[i] = eventData;
                                }
                            }
                        }
                    }
                }
            }

            // 改变租户
            using (_currentTenant.Change(tenantId))
            {
                var    filter    = provider.GetService <ISubscribeFilter>();
                object resultObj = null;

                try
                {
                    if (filter != null)
                    {
                        var etContext = new ExecutingContext(context, executeParameters);
                        filter.OnSubscribeExecuting(etContext);
                        executeParameters = etContext.Arguments;
                    }

                    resultObj = await ExecuteWithParameterAsync(executor, obj, executeParameters);

                    if (filter != null)
                    {
                        var edContext = new ExecutedContext(context, resultObj);
                        filter.OnSubscribeExecuted(edContext);
                        resultObj = edContext.Result;
                    }
                }
                catch (Exception e)
                {
                    if (filter != null)
                    {
                        var exContext = new ExceptionContext(context, e);
                        filter.OnSubscribeException(exContext);
                        if (!exContext.ExceptionHandled)
                        {
                            throw exContext.Exception;
                        }

                        if (exContext.Result != null)
                        {
                            resultObj = exContext.Result;
                        }
                    }
                    else
                    {
                        throw;
                    }
                }

                return(new ConsumerExecutedResult(resultObj, message.GetId(), message.GetCallbackName()));
            }
        }
Example #11
0
 public override void OnSubscribeExecuted(ExecutedContext context)
 {
 }