private void EmitEvents(Queue queue, Guid workerId)
{
queue.Busy = true;
var events = queue.Items.Select(CreateEvent).ToArray();
queue.Items.Clear();
var streamId = "$projections-$" + workerId.ToString("N");
_ioDispatcher.BeginWriteEvents(
_cancellationScope,
streamId,
ExpectedVersion.Any,
SystemAccount.Principal,
events,
completed =>
{
queue.Busy = false;
if (completed.Result == OperationResult.Success)
{
foreach(var evt in events)
{
//TODO: PROJECTIONS: Remove before release
if (!Logging.FilteredMessages.Contains(evt.EventType))
{
Log.Debug("PROJECTIONS: Finished writing events to {0}: {1}", streamId, evt.EventType);
}
}
}
else
{
var message = String.Format("PROJECTIONS: Failed writing events to {0} because of {1}: {2}",
streamId,
completed.Result, String.Join(",", events.Select(x => String.Format("{0}", x.EventType))));
Log.Debug(message); //Can't do anything about it, log and move on
//throw new Exception(message);
}
if (queue.Items.Count > 0)
EmitEvents(queue, workerId);
else
_queues.Remove(workerId);
}).Run();
}