Exemplo n.º 1
0
        /// <summary>
        /// Publish the event.
        /// </summary>
        /// <param name="event">The event to publish.</param>
        /// <param name="cancellationToken">The <see cref="CancellationToken"/>.</param>
        /// <param name="currentRequest">The current request. Pass null if there is not parent request.</param>
        /// <returns>The result of the event.</returns>
        internal async Task PublishAsync(IEvent @event, CancellationToken cancellationToken, HandlerRequest currentRequest)
        {
            if (@event == null)
            {
                throw Error.ArgumentNull("@event");
            }

            if (this.disposed)
            {
                throw new ObjectDisposedException(this.GetType().FullName);
            }

            if (currentRequest == null)
            {
                throw Error.InvalidOperation("The event '{0}' cannot be publish directly. Process a {1} then publish this event into the 'Handle' method.", @event.GetType().Name, typeof(ICommand).Name);
            }

            IEventStore eventStore = this.Configuration.Services.GetServiceOrThrow <IEventStore>();

            await eventStore.StoreAsync(@event, cancellationToken);

            IEventWorker eventWorker = this.Configuration.Services.GetEventWorker();

            using (EventHandlerRequest request = new EventHandlerRequest(this.Configuration, @event, currentRequest))
            {
                request.Processor = new MessageProcessorWrapper(this, request);
                await eventWorker.PublishAsync(request, cancellationToken);
            }
        }
Exemplo n.º 2
0
        /// <summary>
        /// 消息处理
        /// </summary>
        /// <param name="state"></param>
        private void ProcessMessage(object state)
        {
            CommandArgument cmd    = (CommandArgument)state;
            var             data   = (StringArgumentData)cmd.Data;
            IEventWorker    worker = EventWorkerContainer.CreateWorker();
            var             arg    = worker.ToArgument(cmd.command, data.Argument);

            using (RpcContextScope.CreateScope(cmd, arg))
            {
                try
                {
                    worker.Process(cmd.command, arg);
                }
                catch (Exception e)
                {
                    Console.WriteLine(e);
                    if (cmd.cmdId == RpcEnvironment.NET_COMMAND_CALL)
                    {
                        RpcProxy.Result(new CommandResult
                        {
                            Status  = RpcEnvironment.NET_COMMAND_STATE_SERVER_UNKNOW,
                            Message = e.Message
                        });
                    }
                }
            }
        }
Exemplo n.º 3
0
        private static void CreateEventWorkerTracer(ProcessorConfiguration configuration, ITraceWriter traceWriter)
        {
            Contract.Requires(configuration != null);

            IEventWorker worker = GetService <IEventWorker>(configuration.Services);

            if (worker != null && !(worker is EventWorkerTracer))
            {
                EventWorkerTracer tracer = new EventWorkerTracer(worker, traceWriter);
                configuration.Services.Replace(typeof(IEventWorker), tracer);
            }
        }