Пример #1
0
        void IIoSink.PostIo(Ioop ioop)
        {
            ioop.Next = Todo.Post;
            dispatch_ioop(ioop);

            // validate queue counters (issue warnings)
        }
Пример #2
0
 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;
     }
 }
Пример #3
0
        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);
        }
Пример #4
0
        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);
            }
        }
Пример #5
0
        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;
            }
        }
Пример #6
0
        private void complete_io(Ioop ioop, DateTime now)
        {
            ioop.Counters.Completed++;
            _que.Complete(ioop);

            accumulate_ioop_counters(ioop);
        }
Пример #7
0
        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);
        }
Пример #8
0
 void IIoQueue.PushFront(Ioop ioop)
 {
     lock(_mutex) _impl.PushFront(ioop);
 }
Пример #9
0
        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();
        }
Пример #10
0
 void IIoQueue.PushFront(Ioop ioop)
 {
     _que.AddFirst(ioop);
 }
Пример #11
0
 void IIoQueue.Release(Ioop ioop)
 {
 }
Пример #12
0
 void IIoQueue.Push(Ioop ioop)
 {
     _que.AddLast(ioop);
 }
Пример #13
0
 void IIoQueue.Complete(Ioop ioop)
 {
     _que.Remove(ioop);
 }
Пример #14
0
 void IIoQueue.Release(Ioop ioop)
 {
     lock(_mutex) _impl.Release(ioop);
 }
Пример #15
0
 private void init_ioop(Ioop ioop)
 {
 }
Пример #16
0
        private void post_io(Ioop ioop, DateTime now)
        {
            ioop.Events.PostedAt = now;
            ioop.Counters.Posted++;

            ioop.Next = Todo.Send;
            _que.Push(ioop);
        }
Пример #17
0
 private void set_services(Ioop ioop)
 {
     ioop.Services.Que = _que;
     ioop.Services.Out = _writer;
     ioop.Services.In = _reader;
 }
Пример #18
0
 void IIoQueue.Complete(Ioop ioop)
 {
     lock(_mutex) _impl.Complete(ioop);
 }