/// <summary> /// Specify a concurrency limit for tasks executing through the filter. No more than the specified /// number of tasks will be allowed to execute concurrently. /// </summary> /// <typeparam name="T"></typeparam> /// <param name="configurator"></param> /// <param name="partitioner">An existing partitioner that is shared</param> /// <param name="keyProvider">Provides the key from the message</param> /// <param name="encoding"></param> public static void UsePartitioner <T>(this IPipeConfigurator <T> configurator, IPartitioner partitioner, Func <T, string> keyProvider, Encoding encoding = null) where T : class, PipeContext { if (configurator == null) { throw new ArgumentNullException(nameof(configurator)); } if (partitioner == null) { throw new ArgumentNullException(nameof(partitioner)); } if (keyProvider == null) { throw new ArgumentNullException(nameof(keyProvider)); } var textEncoding = encoding ?? Encoding.UTF8; PartitionKeyProvider <T> provider = context => { var key = keyProvider(context) ?? ""; return(textEncoding.GetBytes(key)); }; var specification = new PartitionerPipeSpecification <T>(provider, partitioner); configurator.AddPipeSpecification(specification); }
/// <summary> /// Specify a concurrency limit for tasks executing through the filter. No more than the specified /// number of tasks will be allowed to execute concurrently. /// </summary> /// <typeparam name="TActivity"></typeparam> /// <typeparam name="TLog"></typeparam> /// <param name="configurator"></param> /// <param name="partitionCount">The number of partitions to use when distributing message delivery</param> /// <param name="keyProvider">Provides the key from the message</param> /// <param name="encoding">The text encoding to use to convert the string to byte[] (defaults to UTF8)</param> public static void UsePartitioner <TActivity, TLog>(this IPipeConfigurator <CompensateActivityContext <TActivity, TLog> > configurator, int partitionCount, Func <CompensateActivityContext <TActivity, TLog>, string> keyProvider, Encoding encoding = null) where TActivity : class, CompensateActivity <TLog> where TLog : class { if (configurator == null) { throw new ArgumentNullException(nameof(configurator)); } if (keyProvider == null) { throw new ArgumentNullException(nameof(keyProvider)); } var textEncoding = encoding ?? Encoding.UTF8; PartitionKeyProvider <CompensateActivityContext <TActivity, TLog> > provider = context => { var key = keyProvider(context) ?? ""; return(textEncoding.GetBytes(key)); }; var specification = new PartitionerPipeSpecification <CompensateActivityContext <TActivity, TLog> >(provider, partitionCount); configurator.AddPipeSpecification(specification); }
/// <summary> /// Specify a concurrency limit for tasks executing through the filter. No more than the specified /// number of tasks will be allowed to execute concurrently. /// </summary> /// <typeparam name="T"></typeparam> /// <param name="configurator"></param> /// <param name="partitioner">An existing partitioner that is shared</param> /// <param name="keyProvider">Provides the key from the message</param> public static void UsePartitioner <T>(this IPipeConfigurator <T> configurator, IPartitioner partitioner, Func <T, long> keyProvider) where T : class, PipeContext { if (configurator == null) { throw new ArgumentNullException(nameof(configurator)); } if (partitioner == null) { throw new ArgumentNullException(nameof(partitioner)); } if (keyProvider == null) { throw new ArgumentNullException(nameof(keyProvider)); } PartitionKeyProvider <T> provider = context => { var key = keyProvider(context); return(BitConverter.GetBytes(key)); }; var specification = new PartitionerPipeSpecification <T>(provider, partitioner); configurator.AddPipeSpecification(specification); }
private MessageTable GetMessage(MessageRequest message) { return(new MessageTable(PartitionKeyProvider.GetPartitionKey(DateTime.UtcNow), message.Id.ToString()) { Message = message.Message }); }
static void UseConsumerPartitioner <TConsumer>(IPipeConfigurator <ConsumerConsumeContext <TConsumer> > configurator, int partitionCount, PartitionKeyProvider <ConsumerConsumeContext <TConsumer> > keyProvider) where TConsumer : class { var partitioner = new Partitioner(partitionCount, new Murmur3UnsafeHashGenerator()); var specification = new PartitionConsumerSpecification <TConsumer>(partitioner, keyProvider); configurator.AddPipeSpecification(specification); }
static void UseSagaPartitioner <TSaga>(IPipeConfigurator <SagaConsumeContext <TSaga> > configurator, int partitionCount, PartitionKeyProvider <SagaConsumeContext <TSaga> > keyProvider) where TSaga : class, ISaga { var partitioner = new Partitioner(partitionCount, new Murmur3UnsafeHashGenerator()); var specification = new PartitionSagaSpecification <TSaga>(partitioner, keyProvider); configurator.AddPipeSpecification(specification); }
public PartitionConsumerSpecification(IPartitioner partitioner, PartitionKeyProvider <ConsumerConsumeContext <TConsumer> > keyProvider) { if (partitioner == null) { throw new ArgumentNullException(nameof(partitioner)); } if (keyProvider == null) { throw new ArgumentNullException(nameof(keyProvider)); } _partitioner = partitioner; _keyProvider = keyProvider; }
public IEnumerable <ValidationResult> Validate() { if (GlobalTopology.Send.GetMessageTopology <T>().TryGetConvention(out ICorrelationIdMessageSendTopologyConvention <T> convention) && convention.TryGetMessageCorrelationId(out IMessageCorrelationId <T> messageCorrelationId)) { _keyProvider = context => messageCorrelationId.TryGetCorrelationId(context.Message, out var correlationId) ? correlationId.ToByteArray() : default(Guid).ToByteArray(); } else { yield return(this.Failure("Partition", TypeMetadataCache <T> .ShortName, "A CorrelationId convention for this message type was not found.")); } }
public PartitionFilter(int partitionCount, PartitionKeyProvider <ConsumeContext <TMessage> > keyProvider, IHashGenerator hashGenerator) { _partitionCount = partitionCount; _keyProvider = keyProvider; _hashGenerator = hashGenerator; var mediator = new Mediator <IConcurrencyLimitFilter>(); _partitions = Enumerable.Range(0, partitionCount) .Select(index => new ConcurrencyLimitFilter <ConsumeContext <TMessage> >(1, mediator)) .Cast <IFilter <ConsumeContext <TMessage> > >() .ToArray(); _attemptCount = new long[partitionCount]; _successCount = new long[partitionCount]; _failureCount = new long[partitionCount]; }
/// <summary> /// Specify a concurrency limit for tasks executing through the filter. No more than the specified /// number of tasks will be allowed to execute concurrently. /// </summary> /// <typeparam name="T"></typeparam> /// <param name="configurator"></param> /// <param name="partitionCount">The number of partitions to use when distributing message delivery</param> /// <param name="keyProvider">Provides the key from the message</param> public static void UsePartitioner <T>(this IPipeConfigurator <T> configurator, int partitionCount, Func <T, Guid> keyProvider) where T : class, PipeContext { if (configurator == null) { throw new ArgumentNullException(nameof(configurator)); } if (keyProvider == null) { throw new ArgumentNullException(nameof(keyProvider)); } PartitionKeyProvider <T> provider = context => keyProvider(context).ToByteArray(); var specification = new PartitionerPipeSpecification <T>(provider, partitionCount); configurator.AddPipeSpecification(specification); }
/// <summary> /// Specify a concurrency limit for tasks executing through the filter. No more than the specified /// number of tasks will be allowed to execute concurrently. /// </summary> /// <typeparam name="TActivity"></typeparam> /// <typeparam name="TLog"></typeparam> /// <param name="configurator"></param> /// <param name="partitionCount">The number of partitions to use when distributing message delivery</param> /// <param name="keyProvider">Provides the key from the message</param> public static void UsePartitioner <TActivity, TLog>(this IPipeConfigurator <CompensateActivityContext <TActivity, TLog> > configurator, int partitionCount, Func <CompensateActivityContext <TActivity, TLog>, Guid> keyProvider) where TActivity : class, CompensateActivity <TLog> where TLog : class { if (configurator == null) { throw new ArgumentNullException(nameof(configurator)); } if (keyProvider == null) { throw new ArgumentNullException(nameof(keyProvider)); } PartitionKeyProvider <CompensateActivityContext <TActivity, TLog> > provider = context => keyProvider(context).ToByteArray(); var specification = new PartitionerPipeSpecification <CompensateActivityContext <TActivity, TLog> >(provider, partitionCount); configurator.AddPipeSpecification(specification); }
public CosmosDbCollection(ICosmosDb cosmosDb, ICosmosDbCollectionConfig config, PartitionKeyProvider <TModel> partitionKeyProvider = null) { if (cosmosDb == null) { throw new ArgumentNullException(nameof(cosmosDb)); } if (config == null) { throw new ArgumentNullException(nameof(config)); } if (config.DatabaseId == null) { throw new ArgumentNullException($"Missing configuration for DatabaseId: {this.GetType().Name} "); } if (config.ContainerId == null) { throw new ArgumentNullException($"Missing configuration for ContainerId: {this.GetType().Name} "); } this.cosmosDb = cosmosDb; this.config = config; this.partitionKeyProvider = partitionKeyProvider; }
/// <summary> /// Specify a concurrency limit for tasks executing through the filter. No more than the specified /// number of tasks will be allowed to execute concurrently. /// </summary> /// <typeparam name="TActivity"></typeparam> /// <typeparam name="TArguments"></typeparam> /// <param name="configurator"></param> /// <param name="partitioner">An existing partitioner to share</param> /// <param name="keyProvider">Provides the key from the message</param> public static void UsePartitioner <TActivity, TArguments>(this IPipeConfigurator <ExecuteActivityContext <TActivity, TArguments> > configurator, IPartitioner partitioner, Func <ExecuteActivityContext <TActivity, TArguments>, Guid> keyProvider) where TActivity : class, ExecuteActivity <TArguments> where TArguments : class { if (configurator == null) { throw new ArgumentNullException(nameof(configurator)); } if (partitioner == null) { throw new ArgumentNullException(nameof(partitioner)); } if (keyProvider == null) { throw new ArgumentNullException(nameof(keyProvider)); } PartitionKeyProvider <ExecuteActivityContext <TActivity, TArguments> > provider = context => keyProvider(context).ToByteArray(); var specification = new PartitionerPipeSpecification <ExecuteActivityContext <TActivity, TArguments> >(provider, partitioner); configurator.AddPipeSpecification(specification); }
public PartitionFilter(PartitionKeyProvider <ConsumeContext <TMessage> > keyProvider, IPartitioner partitioner) { _partitioner = partitioner.GetPartitioner(keyProvider); }
public async Task MessageCleanupAsync([TimerTrigger("%TimerScheduleExpression%")] TimerInfo myTimer, ILogger log) { log.LogInformation($"Timer trigger function executed at: {DateTime.Now}"); await this.messageService.CleanupAsync("Messages", PartitionKeyProvider.GetPartitionKey(DateTime.UtcNow.AddDays(-1))); }
public ContextPartitioner(Partitioner partitioner, PartitionKeyProvider <T> keyProvider) { _partitioner = partitioner; _keyProvider = keyProvider; }
IPartitioner <T> IPartitioner.GetPartitioner <T>(PartitionKeyProvider <T> keyProvider) { return(new ContextPartitioner <T>(this, keyProvider)); }
IPartitioner <T> IPartitioner.GetPartitioner <T>(PartitionKeyProvider <T> keyProvider) => new ContextPartitioner <T>(this, keyProvider);
public PartitionerPipeSpecification(PartitionKeyProvider <ConsumeContext <TMessage> > keyProvider, IPartitioner partitioner) { _keyProvider = keyProvider; _partitioner = partitioner; }
public PartitionerPipeSpecification(PartitionKeyProvider <ConsumeContext <TMessage> > keyProvider, int partitionCount) { _keyProvider = keyProvider; _partitionCount = partitionCount; }
public PartitionerPipeSpecification(PartitionKeyProvider <T> keyProvider, int partitionCount) { _keyProvider = keyProvider; _partitionCount = partitionCount; }
public PartitionerPipeSpecification(PartitionKeyProvider <T> keyProvider, IPartitioner partitioner) { _keyProvider = keyProvider; _partitioner = partitioner; }
public PartitionFilter(PartitionKeyProvider <TContext> keyProvider, IPartitioner partitioner) { _partitioner = partitioner.GetPartitioner(keyProvider); }