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); }
void ExecuteQuery(QueryRequest context) { var result = _kernel.Execute(context.Query); context.Response.Post(result); }
private void ExecuteQuery(RequestContext queryContext) { var result = _kernel.Execute((Query)queryContext.Transaction); queryContext.Initiator.Tell(result, Context.Parent); }