Example #1
0
        private async Task RemoveStream(StreamData <TStreamItemCollection, TStreamItem, TStreamItemId> streamData)
        {
            streamData.CompletionTask.TrySetResult(1);

            try
            {
                _readerWriterLock.AcquireWriterLock(TimeSpan.FromSeconds(10));
            }
            catch (Exception e)
            {
                _logger.LogError(
                    $"StreamService<{typeof(TStreamItemCollection).Name}> Remove stream, error happened (peer: {streamData.Peer})", e);
                return;
            }

            try
            {
                _streamList.Remove(streamData);
            }
            finally
            {
                _readerWriterLock.ReleaseWriterLock();
            }

            await AfterStreamRemoved(streamData);

            _logger.LogDebug($"StreamService<{typeof(TStreamItemCollection).Name}> Remove stream connection (peer: {streamData.Peer})");
        }
Example #2
0
        public async Task <StreamData <TStreamItemCollection, TStreamItem, TStreamItemId> > RegisterStream(StreamInfo <TStreamItemCollection> streamInfo,
                                                                                                           StreamFilterBase <TStreamItem, TStreamItemId> filter)
        {
            await BeforeStreamRegistered(streamInfo);

            _logger.LogDebug($"StreamService<{typeof(TStreamItemCollection).Name}> Register stream connection (peer: {streamInfo.Peer})");

            var data = StreamData <TStreamItemCollection, TStreamItem, TStreamItemId> .Create(
                streamInfo,
                filter,
                this._logger,
                this.WriteToStream);

            _readerWriterLock.AcquireWriterLock(Timeout.Infinite);

            try
            {
                _streamList.Add(data);
            }
            finally
            {
                _readerWriterLock.ReleaseWriterLock();
            }

            return(data);
        }
 public ProducerConsumerQueue(
     ILogger logger,
     StreamData <TStreamItemCollection, TStreamItem, TStreamItemId> owner,
     Func <TStreamItemCollection, StreamData <TStreamItemCollection, TStreamItem, TStreamItemId>, Task> processFunc)
 {
     _logger                  = logger;
     _owner                   = owner;
     _processFunc             = processFunc;
     _cancellationTokenSource = new CancellationTokenSource();
 }
Example #4
0
        private async Task WriteToStream(TStreamItemCollection data, StreamData <TStreamItemCollection, TStreamItem, TStreamItemId> streamData)
        {
            try
            {
                var processedData = ProcessDataBeforeSend(data, streamData);

                //Ping
                if (data.StreamItems == null ||
                    !data.StreamItems.Any())
                {
                    await streamData.Stream.WriteAsync(processedData);

                    return;
                }

                //Skip already processed messages
                if (data.StreamItems.All(y => y.StreamItemId.CompareTo(streamData.Cursor) < 0))
                {
                    _logger.LogWarning("Skipped message during streaming {@context}",
                                       new
                    {
                        Peer    = streamData.Peer,
                        Type    = typeof(TStreamItemCollection),
                        Message = data
                    });

                    return;
                }

                streamData.LastSentData = processedData;
                streamData.Cursor       = processedData.StreamItems.Any() ? processedData.StreamItems.Last().StreamItemId : streamData.Cursor;
                await streamData.Stream.WriteAsync(processedData);
            }
            catch (Exception e)
            {
                _logger.LogWarning(e,
                                   "Error happened during streaming {@context}",
                                   new
                {
                    Peer = streamData.Peer,
                    Type = typeof(TStreamItemCollection).Name
                });
                await RemoveStream(streamData);
            }
        }
Example #5
0
 protected virtual Task AfterStreamRemoved(
     StreamData <TStreamItemCollection, TStreamItem, TStreamItemId> streamData)
 {
     return(Task.CompletedTask);
 }
Example #6
0
 public virtual TStreamItemCollection ProcessDataBeforeSend(TStreamItemCollection data,
                                                            StreamData <TStreamItemCollection, TStreamItem, TStreamItemId> streamData)
 {
     return(data);
 }
Example #7
0
 public void SwitchToReady(StreamData <TStreamItemCollection, TStreamItem, TStreamItemId> streamData)
 {
     streamData.ProducerConsumerQueue.Start();
 }