/// <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); } }
/// <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 }); } } } }
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); } }