Ejemplo n.º 1
0
        private bool StreamRequests(PartitionedBlockingCollection <TRequest> collection, CancellationToken serviceCancellationToken)
        {
            var consumerId = _consumerId.Increment();

            using (var streamCancellationTokenSource = new CancellationTokenSource())
                using (var serviceAndStreamCancellationTokenSource = CancellationTokenSource.CreateLinkedTokenSource(serviceCancellationToken, streamCancellationTokenSource.Token))
                {
                    if (!GetRequestStreamWithRetry(consumerId, serviceAndStreamCancellationTokenSource.Token, out var requestStream, out var responseStream))
                    {
                        LogMessage(LogLevel.Debug, consumerId, "Unable to obtain Stream, exiting consumer");
                        streamCancellationTokenSource.Cancel();
                        return(false);
                    }

                    _hasAnyStreamStarted = true;

                    _responseStreamsDic[consumerId] = new ResponseStreamWrapper <TResponse>(consumerId, responseStream, serviceAndStreamCancellationTokenSource.Token);

                    while (!serviceCancellationToken.IsCancellationRequested && _grpcWrapper.IsConnected)
                    {
                        if (!DequeueItems(collection, BatchSizeConfigValue, serviceCancellationToken, out var items))
                        {
                            return(false);
                        }

                        if (items == null || items.Count == 0)
                        {
                            LogMessage(LogLevel.Debug, consumerId, $"Expected a {_modelType} from the collection, but it was null");
                            continue;
                        }

                        var trySendStatus = TrySend(consumerId, requestStream, items, serviceCancellationToken);
                        if (trySendStatus != TrySendStatus.Success)
                        {
                            ProcessFailedItems(items, collection);

                            _grpcWrapper.TryCloseRequestStream(requestStream);
                            streamCancellationTokenSource.Cancel();

                            return(trySendStatus == TrySendStatus.ErrorWithImmediateRetry);
                        }

                        IsStreaming = true;
                    }

                    streamCancellationTokenSource.Cancel();
                }

            return(false);
        }
        private void ProcessEvent_GCStart(EventWrittenEventArgs eventArgs)
        {
            //Identify if the GC was induced by code
            const uint reasonID_Induced            = 0x1;
            const uint reasonID_InducedNotBlocking = 0x7;

            var reason = (uint)eventArgs.Payload[2];

            if (reason == reasonID_Induced || reason == reasonID_InducedNotBlocking)
            {
                _inducedCount?.Increment();
            }

            //Update Collection Counters for each generation including and below the GC depth requested
            var depth = (uint)eventArgs.Payload[1];

            for (var i = 0; i <= depth; i++)
            {
                _collectionCountPerGen?[i]?.Increment();
            }
        }