private static IHost BuildHost() { return(new HostBuilder() .ConfigureServices((hostContext, services) => { var retryPolicy = Policy.Handle <Exception>().WaitAndRetry(new[] { TimeSpan.FromMilliseconds(50), TimeSpan.FromMilliseconds(100), TimeSpan.FromMilliseconds(150) }); var circuitBreakerPolicy = Policy.Handle <Exception>().CircuitBreaker(1, TimeSpan.FromMilliseconds(500)); var retryPolicyAsync = Policy.Handle <Exception>().WaitAndRetryAsync(new[] { TimeSpan.FromMilliseconds(50), TimeSpan.FromMilliseconds(100), TimeSpan.FromMilliseconds(150) }); var circuitBreakerPolicyAsync = Policy.Handle <Exception>() .CircuitBreakerAsync(1, TimeSpan.FromMilliseconds(500)); var policyRegistry = new PolicyRegistry() { { CommandProcessor.RETRYPOLICY, retryPolicy }, { CommandProcessor.CIRCUITBREAKER, circuitBreakerPolicy }, { CommandProcessor.RETRYPOLICYASYNC, retryPolicyAsync }, { CommandProcessor.CIRCUITBREAKERASYNC, circuitBreakerPolicyAsync } }; var producer = new KafkaMessageProducerFactory( new KafkaMessagingGatewayConfiguration() { Name = "paramore.brighter.greetingsender", BootStrapServers = new[] { "localhost:9092" } }, new KafkaPublication() { Topic = new RoutingKey("greeting.event"), MessageSendMaxRetries = 3, MessageTimeoutMs = 1000, MaxInFlightRequestsPerConnection = 1 }) .Create(); services.AddSingleton <IAmAMessageProducer>(producer); services.AddBrighter(options => { options.PolicyRegistry = policyRegistry; options.BrighterMessaging = new BrighterMessaging(new InMemoryOutbox(), producer); }).MapperRegistryFromAssemblies(typeof(GreetingEvent).Assembly); services.AddHostedService <TimedMessageGenerator>(); }) .UseSerilog() .UseConsoleLifetime() .Build()); }
/// <summary> /// This method gets called by the runtime. Use this method to add services to the container. /// </summary> /// <param name="services"></param> public void ConfigureServices(IServiceCollection services) { var retryPolicy = Policy.Handle <Exception>().WaitAndRetry(new[] { TimeSpan.FromMilliseconds(50), TimeSpan.FromMilliseconds(100), TimeSpan.FromMilliseconds(150) }); var circuitBreakerPolicy = Policy.Handle <Exception>().CircuitBreaker(1, TimeSpan.FromMilliseconds(500)); var retryPolicyAsync = Policy.Handle <Exception>().WaitAndRetryAsync(new[] { TimeSpan.FromMilliseconds(50), TimeSpan.FromMilliseconds(100), TimeSpan.FromMilliseconds(150) }); var circuitBreakerPolicyAsync = Policy.Handle <Exception>().CircuitBreakerAsync(1, TimeSpan.FromMilliseconds(500)); var policyRegistry = new PolicyRegistry() { { CommandProcessor.RETRYPOLICY, retryPolicy }, { CommandProcessor.CIRCUITBREAKER, circuitBreakerPolicy }, { CommandProcessor.RETRYPOLICYASYNC, retryPolicyAsync }, { CommandProcessor.CIRCUITBREAKERASYNC, circuitBreakerPolicyAsync }, { Catalog.DynamoDbAccess, retryPolicyAsync } }; var gatewayConnection = new KafkaMessagingGatewayConfiguration { Name = "paramore.brighter.accounttransfer", BootStrapServers = new[] { "localhost:9092" } }; var producer = new KafkaMessageProducerFactory(gatewayConnection).Create(); services.AddBrighter(options => { options.PolicyRegistry = policyRegistry; options.BrighterMessaging = new BrighterMessaging(new InMemoryOutbox(), producer); options.CommandProcessorLifetime = ServiceLifetime.Scoped; }) .AsyncHandlersFromAssemblies(typeof(AddNewAccountHandlerAsync).Assembly) .MapperRegistryFromAssemblies(typeof(AccountEvent).Assembly); services.AddDarker(options => options.HandlerLifetime = ServiceLifetime.Scoped) .AddHandlersFromAssemblies(typeof(GetAccountByIdHandlerAsync).Assembly); services.AddOpenApiDocument(config => { config.PostProcess = document => { document.Info.Version = "v1"; document.Info.Title = "Booking API"; document.Info.Description = "book rooms in our hotel"; document.Info.TermsOfService = "None"; document.Info.Contact = new NSwag.OpenApiContact { Name = "Ian Cooper", Email = string.Empty, Url = "https://twitter.com/icooper" }; }; }); services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2); services.AddDbContext <AccountContext>(options => options.UseMySql(Configuration["Database:Accounts"])); }
static void Main(string[] args) { var kafkaMessagingGatewayConfiguration = new KafkaMessagingGatewayConfiguration() { Name = "paramore.brighter.greetingsender", BootStrapServers = new[] { "localhost:9092" } }; for (var i = 0; i < args.Length; i += 2) { var key = args[i]; var val = default(string); if (i + 1 < args.Length) { val = args[i + 1]; } switch (key) { case "--bootstrap-server": kafkaMessagingGatewayConfiguration.BootStrapServers = new[] { val }; break; default: break; } } var container = new TinyIoCContainer(); var messageMapperFactory = new TinyIoCMessageMapperFactory(container); var messageMapperRegistry = new MessageMapperRegistry(messageMapperFactory) { { typeof(GreetingEvent), typeof(GreetingEventMessageMapper) } }; var messageStore = new InMemoryMessageStore(); var producer = new KafkaMessageProducerFactory(kafkaMessagingGatewayConfiguration) .Create(); var builder = CommandProcessorBuilder.With() .Handlers(new HandlerConfiguration()) .DefaultPolicy() .TaskQueues(new MessagingConfiguration(messageStore, producer, messageMapperRegistry)) .RequestContextFactory(new InMemoryRequestContextFactory()); var commandProcessor = builder.Build(); commandProcessor.Post(new GreetingEvent("Wayne")); }
static void Main(string[] args) { var kafkaMessagingGatewayConfiguration = new KafkaMessagingGatewayConfiguration() { Name = "paramore.brighter.greetingsender", BootStrapServers = new[] { "localhost:9092" } }; for (var i = 0; i < args.Length; i += 2) { var key = args[i]; var val = default(string); if (i + 1 < args.Length) { val = args[i + 1]; } switch (key) { case "--bootstrap-server": kafkaMessagingGatewayConfiguration.BootStrapServers = new[] { val }; break; default: break; } } var serviceCollection = new ServiceCollection(); var producer = new KafkaMessageProducerFactory(kafkaMessagingGatewayConfiguration).Create(); serviceCollection.AddBrighter(options => { var outBox = new InMemoryOutbox(); options.BrighterMessaging = new BrighterMessaging(outBox, outBox, producer, null); }).AutoFromAssemblies(); var serviceProvider = serviceCollection.BuildServiceProvider(); var commandProcessor = serviceProvider.GetService <IAmACommandProcessor>(); commandProcessor.Post(new GreetingEvent("Wayne")); }
private static IHost BuildHost() { return(new HostBuilder() .ConfigureLogging(loggingBuilder => loggingBuilder.AddConsole()) .ConfigureHostConfiguration((configurationBuilder) => { configurationBuilder.SetBasePath(Directory.GetCurrentDirectory()); configurationBuilder.AddEnvironmentVariables(prefix: "ASP_"); }) .ConfigureServices((hostContext, services) => { var gatewayConnection = new KafkaMessagingGatewayConfiguration { Name = "paramore.brighter.accounttransfer", BootStrapServers = new[] { "localhost:9092" } }; var retryPolicy = Policy.Handle <Exception>().WaitAndRetry(new[] { TimeSpan.FromMilliseconds(50), TimeSpan.FromMilliseconds(100), TimeSpan.FromMilliseconds(150) }); var circuitBreakerPolicy = Policy.Handle <Exception>().CircuitBreaker(1, TimeSpan.FromMilliseconds(500)); var retryPolicyAsync = Policy.Handle <Exception>().WaitAndRetryAsync(new[] { TimeSpan.FromMilliseconds(50), TimeSpan.FromMilliseconds(100), TimeSpan.FromMilliseconds(150) }); var circuitBreakerPolicyAsync = Policy.Handle <Exception>().CircuitBreakerAsync(1, TimeSpan.FromMilliseconds(500)); var policyRegistry = new PolicyRegistry() { { CommandProcessor.RETRYPOLICY, retryPolicy }, { CommandProcessor.CIRCUITBREAKER, circuitBreakerPolicy }, { CommandProcessor.RETRYPOLICYASYNC, retryPolicyAsync }, { CommandProcessor.CIRCUITBREAKERASYNC, circuitBreakerPolicyAsync } }; services.AddSingleton <IReadOnlyPolicyRegistry <string> >(policyRegistry); var producer = new KafkaMessageProducerFactory(gatewayConnection).Create(); services .AddBrighter(options => { options.PolicyRegistry = policyRegistry; options.BrighterMessaging = new BrighterMessaging(new InMemoryOutbox(), producer); }) .MapperRegistryFromAssemblies(typeof(AccountEventMessageMapper).Assembly); var useLocalAwsServices = hostContext.Configuration.GetValue <bool>("AWS:UseLocalServices"); if (useLocalAwsServices) { services.AddSingleton <IAmazonDynamoDB>(sp => CreateClient(hostContext.Configuration)); services.AddSingleton <IAmazonDynamoDBStreams>(sp => CreateStreamClient(hostContext.Configuration)); } else { services.AddAWSService <IAmazonDynamoDB>(); services.AddAWSService <IAmazonDynamoDBStreams>(); } var translatorRegistry = new RecordTranslatorRegistry(new TranslatorFactory()); translatorRegistry.Add(typeof(AccountEvent), typeof(AccountFromRecordTranslator)); services.AddSingleton <RecordTranslatorRegistry>(translatorRegistry); services.AddSingleton <IRecordProcessor <StreamRecord>, DynamoDbRecordProcessor>(); services.AddSingleton <IStreamReader, DynamoStreamReader>(); services.AddHostedService <Pump>(); }) .UseSerilog() .UseConsoleLifetime() .Build()); }