/// <summary> /// /// </summary> /// <returns></returns> protected TimeSpan Change() { var model = this.DequeueCommand(); /*任务完成,打个瞌睡,10秒后继续跑*/ if (model == null) { return(this.sleepTimeSpan); } HandlerCommunication communication = null; try { this.PublicCommand(model, out communication); } catch (Exception ex) { this.EnqueueCommand(model.Command, communication, ex.GetInnerException()); } finally { } /*任务未完成,打个瞌睡,10秒后继续跑*/ return(this.sleepTimeSpan); }
public override void OnInit(HandlerCommunication communication, ICommand command) { base.OnInit(communication, command); if (this.Consigner != null && this.Worker != null) { return; } UserPrincipal principal = System.Threading.Thread.CurrentPrincipal as UserPrincipal; if (principal == null) { try { using (var sc = Never.IoC.ContainerContext.Current.ServiceLocator.BeginLifetimeScope()) { var accessor = sc.Resolve <IHttpContextAccessor>(); var authservice = sc.Resolve <IAuthenticationService>(); principal = authservice.GetUserPrincipal(accessor.HttpContext); } } catch { } } if (principal == null) { return; } this.Consigner = principal.CurrentUser; this.Worker = principal.CurrentUser as IWorker; }
/// <summary> /// 保存一个命令,用于重试 /// </summary> /// <param name="communication">上下文</param> /// <param name="command"></param> /// <param name="exception">异常</param> public void EnqueueCommand(ICommand command, HandlerCommunication communication, Exception exception) { this.storager.Enqueue(communication, exception, command); if (this.IsWaited) { this.Pulse(); } }
/// <summary> /// 新加运行时类型到上下文 /// </summary> /// <param name="eventBus">事件总线</param> /// <param name="communication">上下文通讯</param> /// <param name="runtimeMode">当前运行模式</param> public static void AddRuntimeMode(this IEventBus eventBus, HandlerCommunication communication, Aop.IRuntimeMode runtimeMode) { if (communication == null || runtimeMode == null) { return; } communication.RuntimeModeArray.Add(runtimeMode); }
/// <summary> /// 初始化上下文 /// </summary> /// <param name="model"></param> /// <returns></returns> protected virtual HandlerCommunication GetCommandContext(RecoveryCommandModel model) { var context = new HandlerCommunication() { Worker = new RecoveryWorker() { AdditionId = model.Id, AdditionGuid = model.UniqueId } }; return(context); }
/// <summary> /// 新加运行时类型到上下文 /// </summary> /// <param name="eventBus">事件总线</param> /// <param name="communication">上下文通讯</param> /// <param name="runtimeMode">当前运行模式</param> public static void AddRuntimeMode(this IEventBus eventBus, HandlerCommunication communication, string runtimeMode) { if (communication == null) { return; } AddRuntimeMode(eventBus, communication, new Aop.DefaultRuntimeMode() { RuntimeMode = runtimeMode }); }
public void TestSendCommand() { var bool2 = typeof(ICommandHandler <>).IsAssignableFrom(typeof(TestCommandHandler)); var commandBus = ContainerContext.Current.ServiceLocator.Resolve <ICommandBus>(); //var eventBus = ContainerContext.Current.ServiceLocator.Resolve<IEventBus>(); var cmd = new TestCommand(); var dict = new HandlerCommunication(); //CommandBusExtension. // dict["Worker"] = new TestUser(); commandBus.Send(cmd, dict); Thread.Sleep(20000); Console.ReadLine(); }
/// <summary> /// 发布事件 /// </summary> /// <param name="model"></param> /// <param name="communication"></param> protected virtual void PublicCommand(RecoveryCommandModel model, out HandlerCommunication communication) { communication = this.GetCommandContext(model); AnonymousExtension.SendCommand(this.commandBus, model.Command, communication); }
/// <summary> /// /// </summary> /// <typeparam name="TCommand"></typeparam> /// <param name="c"></param> /// <param name="communication"></param> /// <returns></returns> Task <HandlerCommunication> ICommandBus.SendAsync <TCommand>(TCommand c, HandlerCommunication communication) { return(Task.FromResult(new HandlerCommunication())); }
/// <summary> /// /// </summary> /// <typeparam name="TCommand"></typeparam> /// <param name="c"></param> /// <param name="communication"></param> /// <returns></returns> ICommandHandlerResult ICommandBus.Send <TCommand>(TCommand c, HandlerCommunication communication) { return(new CommandHandlerResult(CommandHandlerStatus.Success, string.Empty)); }
/// <summary> /// 发布命令 /// </summary> /// <param name="commandBus">命令总线</param> /// <param name="command">命令</param> /// <param name="communication">上下文通讯</param> public static ICommandHandlerResult SendCommand(this ICommandBus commandBus, ICommand @command, HandlerCommunication communication) { if (@command == null) { throw new ParameterNullException("command", "聚合根命令不能为空"); } if (EmitBuilder.PreferredDynamic) { return(commandBus.Send((dynamic)command, communication)); } var type = @command.GetType(); var action = actionTable[type] as Func <ICommandBus, ICommand, HandlerCommunication, ICommandHandlerResult>; if (action == null) { var emit = EasyEmitBuilder <Func <ICommandBus, ICommand, HandlerCommunication, ICommandHandlerResult> > .NewDynamicMethod(); emit.LoadArgument(0); emit.LoadArgument(1); emit.LoadArgument(2); emit.Call(typeof(AnonymousExtension).GetMethod("SendCommandBuilderInvoker", BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Static).MakeGenericMethod(type)); emit.Return(); actionTable[type] = action = emit.CreateDelegate(); } return(action.Invoke(commandBus, command, communication)); }
/// <summary> /// 发布命令 /// </summary> /// <param name="commandBus">命令总线</param> /// <param name="command">命令</param> /// <param name="communication">上下文通讯</param> private static ICommandHandlerResult SendCommandBuilderInvoker <TCommand>(this ICommandBus commandBus, TCommand @command, HandlerCommunication communication) where TCommand : ICommand { return(commandBus.Send <TCommand>(@command, communication)); }
/// <summary> /// 异步发布命令 /// </summary> /// <param name="commandBus">命令总线</param> /// <param name="command">命令</param> /// <param name="communication">上下文通讯</param> private static Task <HandlerCommunication> SendCommandAsyncBuilderInvoker <TCommand>(this ICommandBus commandBus, TCommand @command, HandlerCommunication communication) where TCommand : ICommand { return(commandBus.SendAsync <TCommand>(@command, communication)); }