public override void OnExecuted(ExecutedContext result) { if (result.Args.FirstOrDefault() != null) { result.Args[0] = result.Args[0].ToString() + "Hello"; Console.Write(result.Args[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); }
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}"); }
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"]}"); }
/// <summary> /// 執行後攔截方法 /// </summary> /// <param name="result"></param> public virtual void OnExecuted(ExecutedContext context) { }
/// <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())); } }
public override void OnSubscribeExecuted(ExecutedContext context) { }