public void CanHandle_Whatever_TrueReturned(int failedAttempts) { var rawMessage = new MemoryStream(); var headers = new[] { new MessageHeader( DefaultMessageHeaders.FailedAttempts, failedAttempts.ToString(CultureInfo.InvariantCulture)) }; var testPolicy = new TestErrorPolicy(); var chain = ErrorPolicy.Chain( ErrorPolicy.Retry().MaxFailedAttempts(3), testPolicy) .Build(_serviceProvider); var result = chain.CanHandle( ConsumerPipelineContextHelper.CreateSubstitute( new InboundEnvelope( rawMessage, headers, new TestOffset(), TestConsumerEndpoint.GetDefault(), TestConsumerEndpoint.GetDefault().Name)), new InvalidOperationException("test")); result.Should().BeTrue(); }
public async Task RetryAndSkipPolicies_JsonChunkSequenceStillFailingAfterRetries_OffsetCommitted() { var tryCount = 0; var serviceProvider = Host.ConfigureServices( services => services .AddLogging() .AddSilverback() .UseModel() .WithConnectionToMessageBroker( options => options.AddMockedKafka( mockedKafkaOptions => mockedKafkaOptions.WithDefaultPartitionsCount(1))) .AddEndpoints( endpoints => endpoints .AddOutbound <IIntegrationEvent>( new KafkaProducerEndpoint(DefaultTopicName) { Chunk = new ChunkSettings { Size = 10 } }) .AddInbound( new KafkaConsumerEndpoint(DefaultTopicName) { Configuration = new KafkaConsumerConfig { GroupId = "consumer1", EnableAutoCommit = false, CommitOffsetEach = 1 }, ErrorPolicy = ErrorPolicy.Chain( ErrorPolicy.Retry().MaxFailedAttempts(10), ErrorPolicy.Skip()) })) .AddSingletonBrokerBehavior <SpyBrokerBehavior>() .AddDelegateSubscriber( (IIntegrationEvent _, IServiceProvider sp) => { var logger = sp.GetRequiredService <ISilverbackLogger <ErrorHandlingTests> >(); tryCount++; logger.LogInformation($"Handling message ({tryCount})..."); throw new InvalidOperationException("Retry!"); })) .Run(); var publisher = serviceProvider.GetRequiredService <IEventPublisher>(); await publisher.PublishAsync( new TestEventOne { Content = "Hello E2E!" }); await KafkaTestingHelper.WaitUntilAllMessagesAreConsumedAsync(); tryCount.Should().Be(11); DefaultTopic.GetCommittedOffsetsCount("consumer1").Should().Be(3); }
public void HandleError_MultiplePoliciesWithMaxFailedAttempts_CorrectPolicyApplied( int failedAttempts, int expectedAppliedPolicy) { var rawMessage = new MemoryStream(); var headers = new[] { new MessageHeader( DefaultMessageHeaders.FailedAttempts, failedAttempts.ToString(CultureInfo.InvariantCulture)) }; var policies = new[] { new TestErrorPolicy().MaxFailedAttempts(2), new TestErrorPolicy().MaxFailedAttempts(2), new TestErrorPolicy().MaxFailedAttempts(2) }; var chain = ErrorPolicy.Chain(policies) .Build(_serviceProvider); chain.HandleErrorAsync( ConsumerPipelineContextHelper.CreateSubstitute( new InboundEnvelope( rawMessage, headers, new TestOffset(), TestConsumerEndpoint.GetDefault(), TestConsumerEndpoint.GetDefault().Name)), new InvalidOperationException("test")); for (var i = 0; i < policies.Length; i++) { policies[i].As <TestErrorPolicy>().Applied.Should().Be(i == expectedAppliedPolicy); } }