void IIoSink.PostIo(Ioop ioop) { ioop.Next = Todo.Post; dispatch_ioop(ioop); // validate queue counters (issue warnings) }
private void accumulate_ioop_counters(Ioop ioop) { lock (_counters) { _counters.OpPosted += ioop.Counters.Posted; _counters.OpSent += ioop.Counters.Sent; _counters.OpCompleted += ioop.Counters.Completed; _counters.OpFailed += ioop.Counters.Failed; } }
void IFunnelsShop.PublishPost(Guid storeId, Post post) { var ioop = new Ioop(); init_ioop(ioop); set_services(ioop); ioop.Io = shop => shop.PublishPost(storeId, post); post.Ioop = ioop; _sink.PostIo(ioop); }
void IIoWriter.Send(Ioop ioop) { ensure_connection(_info); try { ioop.Io(_shop); } catch (Exception ex) { _log.Warn(ex, "Failed to send io {0}; funnelId='{1}'", ioop.SequenceId, _info.FunnelId); close_connection(_info); } }
private void dispatch_ioop(Ioop ioop) { var now = DateTime.Now; switch (ioop.Next) { case Todo.Post: post_io(ioop, now); break; case Todo.Send: send_io(ioop, now); break; case Todo.Complete: complete_io(ioop, now); break; } }
private void complete_io(Ioop ioop, DateTime now) { ioop.Counters.Completed++; _que.Complete(ioop); accumulate_ioop_counters(ioop); }
private void send_io(Ioop ioop, DateTime now) { ioop.Events.SentAt = now; ioop.Counters.Sent++; ioop.Next = Todo.Complete; ioop.OnIoComplete = () => dispatch_ioop(ioop); ioop.OnIoError = ex => handle_io_error(ioop, ex); ioop.Services.Out.Send(ioop); }
void IIoQueue.PushFront(Ioop ioop) { lock(_mutex) _impl.PushFront(ioop); }
private void handle_io_error(Ioop ioop, Exception ex) { ioop.Counters.Failed++; ioop.IoError = ex; _log.Warn(ex, "Failure in ioop {0}", ioop.SequenceId); ioop.Services.Out.CloseConnection(); }
void IIoQueue.PushFront(Ioop ioop) { _que.AddFirst(ioop); }
void IIoQueue.Release(Ioop ioop) { }
void IIoQueue.Push(Ioop ioop) { _que.AddLast(ioop); }
void IIoQueue.Complete(Ioop ioop) { _que.Remove(ioop); }
void IIoQueue.Release(Ioop ioop) { lock(_mutex) _impl.Release(ioop); }
private void init_ioop(Ioop ioop) { }
private void post_io(Ioop ioop, DateTime now) { ioop.Events.PostedAt = now; ioop.Counters.Posted++; ioop.Next = Todo.Send; _que.Push(ioop); }
private void set_services(Ioop ioop) { ioop.Services.Que = _que; ioop.Services.Out = _writer; ioop.Services.In = _reader; }
void IIoQueue.Complete(Ioop ioop) { lock(_mutex) _impl.Complete(ioop); }