コード例 #1
0
        public static Task <ProducerProxy> NewProducerConsumerGrainsAsync(Guid streamId, string streamProvider, TraceLogger logger, int[] grainIds, bool useReentrantGrain)
        {
            int grainCount = grainIds.Length;

            if (grainCount < 1)
            {
                throw new ArgumentOutOfRangeException("grainIds", "The grain count must be at least one");
            }
            logger.Info("ConsumerProxy.NewProducerConsumerGrainsAsync: multiplexing {0} producer grains for stream {1}.", grainCount, streamId);
            var grains = new IStreaming_ProducerGrain[grainCount];
            var dedup  = new Dictionary <int, IStreaming_ProducerGrain>();

            for (var i = 0; i < grainCount; ++i)
            {
                // we deduplicate the grain references to ensure that IEnumerable.Distinct() works as intended.
                if (dedup.ContainsKey(grainIds[i]))
                {
                    grains[i] = dedup[grainIds[i]];
                }
                else
                {
                    if (useReentrantGrain)
                    {
                        grains[i] = GrainClient.GrainFactory.GetGrain <IStreaming_Reentrant_ProducerConsumerGrain>(grainIds[i]);
                    }
                    else
                    {
                        var grainFullName = typeof(Streaming_ProducerConsumerGrain).FullName;
                        grains[i] = GrainClient.GrainFactory.GetGrain <IStreaming_ProducerConsumerGrain>(grainIds[i], grainFullName);
                    }
                    dedup[grainIds[i]] = grains[i];
                }
            }
            return(NewProducerProxy(grains, streamId, streamProvider, null, logger));
        }
コード例 #2
0
        public static Task <ProducerProxy> NewProducerGrainsAsync(Guid streamId, string streamProvider, string streamNamespace, ILogger logger, IInternalGrainFactory grainFactory, Guid[] grainIds = null, int grainCount = 1)
        {
            grainCount = grainIds != null ? grainIds.Length : grainCount;
            if (grainCount < 1)
            {
                throw new ArgumentOutOfRangeException("grainCount", "The grain count must be at least one");
            }
            logger.LogInformation("ProducerProxy.NewProducerGrainsAsync: multiplexing {GrainCount} producer grains for stream {StreamId}.", grainCount, streamId);
            var grains = new IStreaming_ProducerGrain[grainCount];
            var dedup  = new Dictionary <Guid, IStreaming_ProducerGrain>();
            var producerGrainFullName = typeof(Streaming_ProducerGrain).FullName;

            for (var i = 0; i < grainCount; ++i)
            {
                if (grainIds != null)
                {
                    // we deduplicate the grain references to ensure that IEnumerable.Distinct() works as intended.
                    if (dedup.ContainsKey(grainIds[i]))
                    {
                        grains[i] = dedup[grainIds[i]];
                    }
                    else
                    {
                        var gref = grainFactory.GetGrain <IStreaming_ProducerGrain>(grainIds[i], producerGrainFullName);
                        grains[i]          = gref;
                        dedup[grainIds[i]] = gref;
                    }
                }
                else
                {
                    grains[i] = grainFactory.GetGrain <IStreaming_ProducerGrain>(Guid.NewGuid(), producerGrainFullName);
                }
            }
            return(NewProducerProxy(grains, streamId, streamProvider, streamNamespace, logger));
        }
コード例 #3
0
        public static Task <ProducerProxy> NewProducerClientObjectsAsync(Guid streamId, string streamProvider, string streamNamespace, TraceLogger logger, int producersCount = 1)
        {
            if (producersCount < 1)
            {
                throw new ArgumentOutOfRangeException("producersCount", "The producer count must be at least one");
            }
            var producers = new IStreaming_ProducerGrain[producersCount];

            for (var i = 0; i < producersCount; ++i)
            {
                producers[i] = Streaming_ProducerClientObject.NewObserver(logger);
            }
            logger.Info("ProducerProxy.NewProducerClientObjectsAsync: multiplexing {0} producer client objects for stream {1}.", producersCount, streamId);
            return(NewProducerProxy(producers, streamId, streamProvider, streamNamespace, logger));
        }