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})"); }
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(); }
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); } }
protected virtual Task AfterStreamRemoved( StreamData <TStreamItemCollection, TStreamItem, TStreamItemId> streamData) { return(Task.CompletedTask); }
public virtual TStreamItemCollection ProcessDataBeforeSend(TStreamItemCollection data, StreamData <TStreamItemCollection, TStreamItem, TStreamItemId> streamData) { return(data); }
public void SwitchToReady(StreamData <TStreamItemCollection, TStreamItem, TStreamItemId> streamData) { streamData.ProducerConsumerQueue.Start(); }