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)); }
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)); }
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)); }