Ejemplo n.º 1
0
        /// <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;
        }
Ejemplo n.º 3
0
 /// <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();
     }
 }
Ejemplo n.º 4
0
        /// <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);
        }
Ejemplo n.º 5
0
        /// <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);
        }
Ejemplo n.º 6
0
        /// <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
            });
        }
Ejemplo n.º 7
0
        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();
        }
Ejemplo n.º 8
0
 /// <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);
 }
Ejemplo n.º 9
0
 /// <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()));
 }
Ejemplo n.º 10
0
 /// <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));
 }
Ejemplo n.º 11
0
        /// <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));
        }
Ejemplo n.º 12
0
 /// <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));
 }
Ejemplo n.º 13
0
 /// <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));
 }