public ExecutionPipeline(Kernel kernel) { _kernel = kernel; _commandQueue = new BufferBlock<CommandRequest[]>(); _queryQueue = new BatchBlock<QueryRequest>(MaxConcurrentQueries); var transactionHandler = new ActionBlock<object>(t => { if (t is QueryRequest[]) { var queries = t as QueryRequest[]; Task[] tasks = queries.Select(q => Task.Factory.StartNew(_ => ExecuteQuery(q), null)).ToArray(); Task.WaitAll(tasks); } else if (t is CommandRequest[]) { var commands = t as CommandRequest[]; foreach (var commandContext in commands) { var result = _kernel.Execute(commandContext.Command); commandContext.Response.Post(result); } } }); _commandQueue.LinkTo(transactionHandler); _queryQueue.LinkTo(transactionHandler); _timer = new Timer(_ => _queryQueue.TriggerBatch()); _timer.Change(Interval, Interval); }
public Executor(Kernel kernel) { _kernel = kernel; Receive<RequestContext[]>(commands => ExecuteCommands(commands)); Receive<RequestContext>(ctx => ExecuteQuery(ctx)); }