/// <summary> /// Initializes a new instance. /// </summary> /// <param name="plan">The plan.</param> /// <param name="factory">The factory.</param> public ConsumerBase( ConsumerPlan plan, Func <ConsumerMetadata, T> factory) { _plan = plan; _factory = factory; }
/// <summary> /// Subscribe consumer. /// </summary> /// <typeparam name="T"></typeparam> /// <param name="factory">The factory.</param> /// <param name="consumerGroup"> /// Consumer Group allow a group of clients to cooperate /// consuming a different portion of the same stream of messages /// </param> /// <param name="consumerName"> /// Optional Name of the consumer. /// Can use for observability. /// </param> /// <returns> /// The partition subscription (dispose to remove the subscription) /// </returns> IConsumerLifetime IConsumerSubscribeBuilder.Subscribe <T>( Func <ConsumerMetadata, T> factory, string?consumerGroup, string?consumerName) { #region Validation if (_plan == null) { throw new ArgumentNullException(nameof(_plan)); } #endregion // Validation consumerGroup = consumerGroup ?? $"{DateTime.UtcNow:yyyy-MM-dd HH_mm} {Guid.NewGuid():N}"; ConsumerPlan plan = _plan.WithConsumerGroup(consumerGroup, consumerName); if (plan.SegmentationStrategies.Count == 0) { plan = plan.AddSegmentation(new ConsumerDefaultSegmentationStrategy()); } var consumer = new ConsumerBase <T>(plan, factory); var subscription = consumer.Subscribe(); return(subscription); }
/// <summary> /// Initializes a new instance. /// </summary> /// <param name="copyFrom">The copy from.</param> /// <param name="channel">The channel.</param> /// <param name="partition">The partition.</param> /// <param name="shard">The shard.</param> /// <param name="logger">The logger.</param> /// <param name="options">The options.</param> /// <param name="segmentationStrategies">The segmentation strategies.</param> /// <param name="interceptors">The interceptors.</param> /// <param name="routes">The routes.</param> /// <param name="cancellation">The cancellation token.</param> /// <param name="consumerGroup">Consumer Group allow a group of clients to cooperate /// consuming a different portion of the same stream of messages</param> /// <param name="consumerName">Optional Name of the consumer. /// Can use for observability.</param> /// <param name="resiliencePolicy">The resilience policy.</param> private ConsumerPlan( ConsumerPlan copyFrom, IConsumerChannelProvider?channel = null, string?partition = null, string?shard = null, ILogger?logger = null, IEventSourceConsumerOptions?options = null, IImmutableList <IConsumerAsyncSegmentationStrategy>?segmentationStrategies = null, IImmutableList <IConsumerAsyncInterceptor>?interceptors = null, IImmutableList <IConsumerHooksBuilder>?routes = null, CancellationToken?cancellation = null, string?consumerGroup = null, string?consumerName = null, AsyncPolicy?resiliencePolicy = null) { Channel = channel ?? copyFrom.Channel; Partition = partition ?? copyFrom.Partition; Shard = shard ?? copyFrom.Shard; Logger = logger ?? copyFrom.Logger; Options = options ?? copyFrom.Options; SegmentationStrategies = segmentationStrategies ?? copyFrom.SegmentationStrategies; Interceptors = interceptors ?? copyFrom.Interceptors; Routes = routes ?? copyFrom.Routes; Cancellation = cancellation ?? copyFrom.Cancellation; ConsumerGroup = consumerGroup ?? copyFrom.ConsumerGroup; ConsumerName = consumerName ?? copyFrom.ConsumerName; ResiliencePolicy = resiliencePolicy ?? copyFrom.ResiliencePolicy; }
/// <summary> /// Initializes a new instance. /// </summary> /// <param name="plan">The plan.</param> private ConsumerBuilder(ConsumerPlan plan) { _plan = plan; }