static void Main(string[] args) { Log.Logger = new LoggerConfiguration() .MinimumLevel.Debug() .Enrich.FromLogContext() .WriteTo.Console() .CreateLogger(); var serviceCollection = new ServiceCollection(); serviceCollection.AddSingleton <ILoggerFactory>(new SerilogLoggerFactory()); var rmqConnection = new RmqMessagingGatewayConnection { AmpqUri = new AmqpUriSpecification(new Uri("amqp://*****:*****@localhost:5672")), Exchange = new Exchange("paramore.brighter.exchange"), }; var producer = new RmqMessageProducer(rmqConnection); var rmqMessageConsumerFactory = new RmqMessageConsumerFactory(rmqConnection); var replySubscriptions = new[] { new RmqSubscription(typeof(GreetingReply)) }; serviceCollection .AddBrighter(options => { options.ChannelFactory = new ChannelFactory(rmqMessageConsumerFactory); }) .UseInMemoryOutbox() .UseExternalBus( new RmqProducerRegistryFactory( rmqConnection, new RmqPublication[] { new RmqPublication() { Topic = new RoutingKey("Greeting.Request") } }).Create(), true, replySubscriptions) .AutoFromAssemblies(); var serviceProvider = serviceCollection.BuildServiceProvider(); var commandProcessor = serviceProvider.GetService <IAmACommandProcessor>(); Console.WriteLine("Requesting Salutation..."); //blocking call commandProcessor.Call <GreetingRequest, GreetingReply>(new GreetingRequest { Name = "Ian", Language = "en-gb" }, 2000); Console.WriteLine("Done..."); Console.ReadLine(); }
public void Establish() { var messageMapperRegistry = new MessageMapperRegistry(new SimpleMessageMapperFactory(() => new MyEventMessageMapper())); messageMapperRegistry.Register <MyEvent, MyEventMessageMapper>(); var policyRegistry = new PolicyRegistry { { CommandProcessor.RETRYPOLICY, Policy .Handle <Exception>() .WaitAndRetry(new[] { TimeSpan.FromMilliseconds(50) }) }, { CommandProcessor.CIRCUITBREAKER, Policy .Handle <Exception>() .CircuitBreaker(1, TimeSpan.FromMilliseconds(500)) } }; var connection = new RmqMessagingGatewayConnection { AmpqUri = new AmqpUriSpecification(new Uri("amqp://*****:*****@localhost:5672/%2f")), Exchange = new Exchange("paramore.brighter.exchange") }; var rmqMessageConsumerFactory = new RmqMessageConsumerFactory(connection); var rmqMessageProducerFactory = new RmqMessageProducerFactory(connection); var connections = new List <Connection> { new Connection( new ConnectionName("foo"), new InputChannelFactory(rmqMessageConsumerFactory, rmqMessageProducerFactory), typeof(MyEvent), new ChannelName("mary"), "bob", timeoutInMilliseconds: 200), new Connection( new ConnectionName("bar"), new InputChannelFactory(rmqMessageConsumerFactory, rmqMessageProducerFactory), typeof(MyEvent), new ChannelName("alice"), "simon", timeoutInMilliseconds: 200) }; _builder = DispatchBuilder.With() .CommandProcessor(CommandProcessorBuilder.With() .Handlers(new HandlerConfiguration(new SubscriberRegistry(), new TinyIocHandlerFactory(new TinyIoCContainer()))) .Policies(policyRegistry) .NoTaskQueues() .RequestContextFactory(new InMemoryRequestContextFactory()) .Build() ) .MessageMappers(messageMapperRegistry) .ChannelFactory(new InputChannelFactory(rmqMessageConsumerFactory, rmqMessageProducerFactory)) .Connections(connections); }
public GreetingService() { log4net.Config.XmlConfigurator.Configure(); var container = new TinyIoCContainer(); var handlerFactory = new TinyIocHandlerFactory(container); var messageMapperFactory = new TinyIoCMessageMapperFactory(container); container.Register <IHandleRequests <GreetingCommand>, GreetingCommandHandler>(); var subscriberRegistry = new SubscriberRegistry(); subscriberRegistry.Register <GreetingCommand, GreetingCommandHandler>(); //create policies 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 policyRegistry = new PolicyRegistry() { { CommandProcessor.RETRYPOLICY, retryPolicy }, { CommandProcessor.CIRCUITBREAKER, circuitBreakerPolicy } }; //create message mappers var messageMapperRegistry = new MessageMapperRegistry(messageMapperFactory) { { typeof(GreetingCommand), typeof(GreetingCommandMessageMapper) } }; //create the gateway var rmqMessageConsumerFactory = new RmqMessageConsumerFactory(); var rmqMessageProducerFactory = new RmqMessageProducerFactory(); var builder = DispatchBuilder .With() .CommandProcessor(CommandProcessorBuilder.With() .Handlers(new HandlerConfiguration(subscriberRegistry, handlerFactory)) .Policies(policyRegistry) .NoTaskQueues() .RequestContextFactory(new InMemoryRequestContextFactory()) .Build() ) .MessageMappers(messageMapperRegistry) .ChannelFactory(new InputChannelFactory(rmqMessageConsumerFactory, rmqMessageProducerFactory)) .ConnectionsFromConfiguration(); _dispatcher = builder.Build(); }
private static IHost BuildHost() { var host = new HostBuilder() .ConfigureLogging(loggingBuilder => loggingBuilder.AddConsole()) .ConfigureHostConfiguration((configurationBuilder) => { configurationBuilder.SetBasePath(Directory.GetCurrentDirectory()); configurationBuilder.AddEnvironmentVariables(prefix: "CCP_"); }) .ConfigureServices((hostContext, services) => { var connections = new Connection[] { new Connection <GuestRoomBookingMade>( new ConnectionName("credit.card.booking.event"), new ChannelName("credit.card.booking.event"), new RoutingKey("booking.event"), timeoutInMilliseconds: 200, isDurable: true, highAvailability: true) }; var rmqConnection = new RmqMessagingGatewayConnection { AmpqUri = new AmqpUriSpecification(new Uri("amqp://*****:*****@localhost:5672")), Exchange = new Exchange("hotel.booking.exchange") }; var rmqMessageConsumerFactory = new RmqMessageConsumerFactory(rmqConnection); var inboxConfiguration = new MySqlInboxConfiguration ( hostContext.Configuration["Database:CardDetails"], hostContext.Configuration["Database:InboxTableName"] ); var inbox = new MySqlInbox(inboxConfiguration); services.AddSingleton <IAmAnInbox>(inbox); services.AddServiceActivator(options => { options.Connections = connections; options.ChannelFactory = new ChannelFactory(rmqMessageConsumerFactory); options.BrighterMessaging = new BrighterMessaging(new InMemoryOutbox(), new RmqMessageProducer(rmqConnection)); }).AutoFromAssemblies(); services.AddHostedService <ServiceActivatorHostedService>(); services.AddDbContext <CardDetailsContext>(options => options.UseMySql(hostContext.Configuration["Database:CardDetails"])); }) .UseSerilog() .UseConsoleLifetime() .Build(); return(host); }
public static async Task Main(string[] args) { Log.Logger = new LoggerConfiguration() .MinimumLevel.Debug() .Enrich.FromLogContext() .WriteTo.Console() .CreateLogger(); var host = new HostBuilder() .ConfigureServices((hostContext, services) => { var subscriptions = new Subscription[] { new RmqSubscription <GreetingEvent>( new SubscriptionName("paramore.example.greeting"), new ChannelName("greeting.event"), new RoutingKey("greeting.event"), timeoutInMilliseconds: 200, isDurable: true, highAvailability: true, makeChannels: OnMissingChannel.Create), //change to OnMissingChannel.Validate if you have infrastructure declared elsewhere new RmqSubscription <FarewellEvent>( new SubscriptionName("paramore.example.farewell"), //change to OnMissingChannel.Validate if you have infrastructure declared elsewhere new ChannelName("farewell.event"), new RoutingKey("farewell.event"), timeoutInMilliseconds: 200, isDurable: true, highAvailability: true, makeChannels: OnMissingChannel.Create) }; var rmqConnection = new RmqMessagingGatewayConnection { AmpqUri = new AmqpUriSpecification(new Uri("amqp://*****:*****@localhost:5672")), Exchange = new Exchange("paramore.brighter.exchange") }; var rmqMessageConsumerFactory = new RmqMessageConsumerFactory(rmqConnection); services.AddServiceActivator(options => { options.Subscriptions = subscriptions; options.ChannelFactory = new ChannelFactory(rmqMessageConsumerFactory); }) .UseInMemoryOutbox() .UseExternalBus(new RmqMessageProducer(rmqConnection)) .AutoFromAssemblies(); services.AddHostedService <ServiceActivatorHostedService>(); }) .UseConsoleLifetime() .UseSerilog() .Build(); await host.RunAsync(); }
public DispatchBuilderTests() { var messageMapperRegistry = new MessageMapperRegistry(new SimpleMessageMapperFactory((_) => new MyEventMessageMapper())); messageMapperRegistry.Register <MyEvent, MyEventMessageMapper>(); 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 rmqConnection = new RmqMessagingGatewayConnection { AmpqUri = new AmqpUriSpecification(new Uri("amqp://*****:*****@localhost:5672/%2f")), Exchange = new Exchange("paramore.brighter.exchange") }; var rmqMessageConsumerFactory = new RmqMessageConsumerFactory(rmqConnection); var container = new ServiceCollection(); var commandProcessor = CommandProcessorBuilder.With() .Handlers(new HandlerConfiguration(new SubscriberRegistry(), (IAmAHandlerFactory) new ServiceProviderHandlerFactory(container.BuildServiceProvider()))) .Policies(new PolicyRegistry { { CommandProcessor.RETRYPOLICY, retryPolicy }, { CommandProcessor.CIRCUITBREAKER, circuitBreakerPolicy } }) .NoTaskQueues() .RequestContextFactory(new InMemoryRequestContextFactory()) .Build(); _builder = DispatchBuilder.With() .CommandProcessor(commandProcessor) .MessageMappers(messageMapperRegistry) .DefaultChannelFactory(new ChannelFactory(rmqMessageConsumerFactory)) .Connections(new [] { new Connection <MyEvent>( new ConnectionName("foo"), new ChannelName("mary"), new RoutingKey("bob"), timeoutInMilliseconds: 200), new Connection <MyEvent>( new ConnectionName("bar"), new ChannelName("alice"), new RoutingKey("simon"), timeoutInMilliseconds: 200) }); }
public static void Main(string[] args) { Log.Logger = new LoggerConfiguration() .WriteTo.Console() .CreateLogger(); var container = new Container(); container.Options.ConstructorResolutionBehavior = new MostResolvableParametersConstructorResolutionBehavior(container); var builder = new ConfigurationBuilder() .AddEnvironmentVariables(); Configuration = builder.Build(); //Database - this won't work, as its not the same Db as the web site, we should switch to Sql Server here var options = new DbContextOptionsBuilder <ToDoContext>() .UseMySql(Configuration["Database:ToDo"]) .Options; container.Register(() => options); //Exchange var rmqConnnection = new RmqMessagingGatewayConnection { AmpqUri = new AmqpUriSpecification(new Uri(Configuration["RabbitMQ:Uri"])), Exchange = new Exchange(Configuration["RabbitMQ:Exchange"]), }; var rmqMessageConsumerFactory = new RmqMessageConsumerFactory(rmqConnnection); var rmqMessageProducerFactory = new RmqMessageProducerFactory(rmqConnnection); // Channels (Message Routing) var connections = new List <Connection> { new Connection <BulkAddToDoCommand>( new ConnectionName("future.stack.todo"), new ChannelName("bulkaddtodo.command"), new RoutingKey("bulkaddtodo.command"), timeoutInMilliseconds: 200, isAsync: true) }; var dispatcher = CreateDispatcher(container, connections, rmqMessageConsumerFactory, rmqMessageProducerFactory); CheckDbIsUp(Configuration["Database:ToDoDb"]); //Must call once all container registrations complete, as cannnot register post first get. EnsureDatabaseCreated(container); dispatcher.Receive(); Console.WriteLine("Press Enter to stop ..."); Console.ReadLine(); dispatcher.End().Wait(); }
public static async Task Main(string[] args) { Log.Logger = new LoggerConfiguration() .MinimumLevel.Debug() .Enrich.FromLogContext() .WriteTo.Console() .CreateLogger(); var host = new HostBuilder() .ConfigureServices((hostContext, services) => { var subscriptions = new Subscription[] { new RmqSubscription <GreetingRequest>( new SubscriptionName("paramore.example.greeting"), new ChannelName("Greeting.Request"), new RoutingKey("Greeting.Request"), timeoutInMilliseconds: 200, isDurable: true, highAvailability: true) }; var rmqConnection = new RmqMessagingGatewayConnection { AmpqUri = new AmqpUriSpecification(new Uri("amqp://*****:*****@localhost:5672")), Exchange = new Exchange("paramore.brighter.exchange") }; var rmqMessageConsumerFactory = new RmqMessageConsumerFactory(rmqConnection); ChannelFactory amAChannelFactory = new ChannelFactory(rmqMessageConsumerFactory); var producer = new RmqMessageProducer(rmqConnection); services.AddServiceActivator(options => { options.Subscriptions = subscriptions; options.ChannelFactory = amAChannelFactory; }) .UseInMemoryOutbox() .UseExternalBus( new RmqProducerRegistryFactory( rmqConnection, new RmqPublication[] { new() { //TODO: We don't know the reply routing key, but need a topic name, we could make this simpler Topic = new RoutingKey("Reply"), MakeChannels = OnMissingChannel.Assume } }).Create(), true) .AutoFromAssemblies(); services.AddHostedService <ServiceActivatorHostedService>(); })
private static Dispatcher CreateDispatcher( Container container, List <Connection> connections, RmqMessageConsumerFactory rmqMessageConsumerFactory, RmqMessageProducerFactory rmqMessageProducerFactory ) { var handlerFactoryAsync = new ServicesHandlerFactoryAsync(container); container.Register <IHandleRequestsAsync <BulkAddToDoCommand>, BulkAddToDoCommandHandlerAsync>(); var messageMapperFactory = new MessageMapperFactory(container); container.Register <IAmAMessageMapper <BulkAddToDoCommand>, BulkAddToDoMessageMapper>(); var subscriberRegistry = new SubscriberRegistry(); subscriberRegistry.RegisterAsync <BulkAddToDoCommand, BulkAddToDoCommandHandlerAsync>(); //create policies 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 } }; //create message mappers var messageMapperRegistry = new MessageMapperRegistry(messageMapperFactory) { { typeof(BulkAddToDoCommand), typeof(BulkAddToDoMessageMapper) } }; var builder = DispatchBuilder .With() .CommandProcessor(CommandProcessorBuilder.With() .Handlers(new HandlerConfiguration(subscriberRegistry, handlerFactoryAsync)) .Policies(policyRegistry) .NoTaskQueues() .RequestContextFactory(new InMemoryRequestContextFactory()) .Build() ) .MessageMappers(messageMapperRegistry) .DefaultChannelFactory(new InputChannelFactory(rmqMessageConsumerFactory, rmqMessageProducerFactory)) .Connections(connections); var dispatcher = builder.Build(); return(dispatcher); }
public OrganizationApplicationService() { log4net.Config.XmlConfigurator.Configure(); var container = new UnityContainer(); var logger = LogProvider.For <OrganizationApplicationService>(); container.RegisterInstance(typeof(ILog), LogProvider.For <OrganizationApplicationService>(), new ContainerControlledLifetimeManager()); container.RegisterType <AddOrganizationCommandHandler>(); //container.RegisterType<AddEFOrganisationCommandHandler>(); container.RegisterType <ChangeOrganizationCommandHandler>(); container.RegisterType <OrganizationAddedEventHandler>(); container.RegisterType <OrganizationAddedLegacyEventHandler>(); //Factories //container.RegisterType(typeof(ICommandFactory<AddOrganizationCommand>),typeof(CommandFactory<AddOrganizationCommand, AxaAddOrganizationCommandExtension>)); //container.RegisterType<IDomainFactory, AxaDomainFactory>(); //container.RegisterType(typeof(ICommandFactory<>), typeof(CommandFactory<>)); container.RegisterType <IDomainFactory, DomainFactory>(); container.RegisterType(typeof(IDomainTracking <>), typeof(DomainTracking <>)); //Repositories container.RegisterType <IOrganizationRepository, OrganizationRepository>(); container.RegisterType(typeof(IEFGenericRepository <>), typeof(EFGenericRepository <>)); container.RegisterType(typeof(IDapperGenericRepository <>), typeof(DapperGenericRepository <>)); //container.RegisterType<DbContext, OrganisationDbContext>(new ContainerControlledLifetimeManager()); container.RegisterType(typeof(IGenericRepository <>), typeof(EFGenericRepository <>)); //Command Processor paramore.brighter.commandprocessor.CommandProcessor commandProcessor = CreateCommandProcesor(container); container.RegisterInstance(typeof(IAmACommandProcessor), commandProcessor); var rmqMessageConsumerFactory = new RmqMessageConsumerFactory(logger); var rmqMessageProducerFactory = new RmqMessageProducerFactory(logger); var messageMapperFactory = new UnityMessageMapperFactory(container); var messageMapperRegistry = new MessageMapperRegistry(messageMapperFactory); messageMapperRegistry.Register <AddOrganizationCommand, AddOrganizationCommandMessageMapper>(); _dispatcher = DispatchBuilder.With() .CommandProcessor(commandProcessor) .MessageMappers(messageMapperRegistry) .ChannelFactory(new InputChannelFactory(rmqMessageConsumerFactory, rmqMessageProducerFactory)) .ConnectionsFromConfiguration() .Build(); }
public static async Task Main(string[] args) { Log.Logger = new LoggerConfiguration() .MinimumLevel.Debug() .Enrich.FromLogContext() .WriteTo.Console() .CreateLogger(); var host = new HostBuilder() .ConfigureServices((hostContext, services) => { var subscriptions = new Subscription[] { new RmqSubscription <GreetingEvent>( new SubscriptionName("paramore.example.greeting"), channelName: new ChannelName("greeting.event"), routingKey: new RoutingKey("greeting.event"), bufferSize: 10, timeoutInMilliseconds: 200, isDurable: true, highAvailability: true, makeChannels: OnMissingChannel.Create) }; var rmqConnection = new RmqMessagingGatewayConnection { AmpqUri = new AmqpUriSpecification(new Uri("amqp://*****:*****@localhost:5672")), Exchange = new Exchange("paramore.brighter.exchange") }; var rmqMessageConsumerFactory = new RmqMessageConsumerFactory(rmqConnection); var outBox = new InMemoryOutbox(); services.AddServiceActivator(options => { options.Subscriptions = subscriptions; options.ChannelFactory = new ChannelFactory(rmqMessageConsumerFactory); }).AutoFromAssemblies(); services.AddSingleton <IAmAnOutboxViewer <Message> >(outBox); services.AddHostedService <ServiceActivatorHostedService>(); }) .UseConsoleLifetime() .UseSerilog() .Build(); await host.RunAsync(); }
public static async Task Main(string[] args) { Log.Logger = new LoggerConfiguration() .MinimumLevel.Debug() .Enrich.FromLogContext() .WriteTo.Console() .CreateLogger(); var host = new HostBuilder() .ConfigureServices((hostContext, services) => { var connections = new Connection[] { new Connection <GreetingRequest>( new ConnectionName("paramore.example.greeting"), new ChannelName("Greeting.Request"), new RoutingKey("Greeting.Request"), timeoutInMilliseconds: 200, isDurable: true, highAvailability: true) }; var rmqConnection = new RmqMessagingGatewayConnection { AmpqUri = new AmqpUriSpecification(new Uri("amqp://*****:*****@localhost:5672")), Exchange = new Exchange("paramore.brighter.exchange") }; var rmqMessageConsumerFactory = new RmqMessageConsumerFactory(rmqConnection); ChannelFactory amAChannelFactory = new ChannelFactory(rmqMessageConsumerFactory); var amAMessageProducer = new RmqMessageProducer(rmqConnection); services.AddServiceActivator(options => { options.Connections = connections; options.ChannelFactory = amAChannelFactory; var outBox = new InMemoryOutbox(); options.BrighterMessaging = new BrighterMessaging(outBox, outBox, amAMessageProducer, null); }).AutoFromAssemblies(); services.AddHostedService <ServiceActivatorHostedService>(); }) .UseConsoleLifetime() .UseSerilog() .Build(); await host.RunAsync(); }
private static IHost BuildHost() { return(new HostBuilder() .ConfigureLogging(loggingBuilder => loggingBuilder.AddConsole()) .ConfigureHostConfiguration((configurationBuilder) => { configurationBuilder.SetBasePath(Directory.GetCurrentDirectory()); configurationBuilder.AddEnvironmentVariables(prefix: "ASR_"); }) .ConfigureServices((hostContext, services) => { var connections = new Connection[] { new Connection <UpsertAccountEvent>( new ConnectionName("credit.card.account.stream"), new ChannelName("account.event"), new RoutingKey("account.event"), timeoutInMilliseconds: 200, isDurable: true, highAvailability: true) }; var rmqConnection = new RmqMessagingGatewayConnection { AmpqUri = new AmqpUriSpecification(new Uri("amqp://*****:*****@localhost:5672")), Exchange = new Exchange("hotel.booking.exchange") }; var rmqMessageConsumerFactory = new RmqMessageConsumerFactory(rmqConnection); services.AddServiceActivator(options => { options.Connections = connections; options.ChannelFactory = new ChannelFactory(rmqMessageConsumerFactory); }) .HandlersFromAssemblies(typeof(UpsertAccountEventHandler).Assembly) .MapperRegistryFromAssemblies(typeof(AccountEventMessageMapper).Assembly); services.AddSingleton <ILoggerFactory>(x => new SerilogLoggerFactory()); services.AddHostedService <ServiceActivatorHostedService>(); services.AddDbContext <CardDetailsContext>(options => options.UseMySql(hostContext.Configuration["Database:CardDetails"])); }) .UseSerilog() .UseConsoleLifetime() .Build()); }
private static async Task Main(string[] args) { Log.Logger = new LoggerConfiguration() .MinimumLevel.Debug() .MinimumLevel.Override("Microsoft", LogEventLevel.Information) .Enrich.FromLogContext() .WriteTo.Console() .CreateLogger(); var host = new HostBuilder() .ConfigureServices((hostContext, services) => { var connections = new Connection[] { new Connection <GreetingEvent>( new ConnectionName("paramore.example.greeting"), new ChannelName("greeting.event"), new RoutingKey("greeting.event"), timeoutInMilliseconds: 200, isDurable: true, highAvailability: true) }; var rmqConnnection = new RmqMessagingGatewayConnection { AmpqUri = new AmqpUriSpecification(new Uri("amqp://*****:*****@localhost:5672")), Exchange = new Exchange("paramore.brighter.exchange") }; var rmqMessageConsumerFactory = new RmqMessageConsumerFactory(rmqConnnection); services.AddServiceActivator(options => { options.Connections = connections; options.ChannelFactory = new InputChannelFactory(rmqMessageConsumerFactory); }) .MapperRegistryFromAssemblies(typeof(GreetingEventHandler).Assembly) .HandlersFromAssemblies(typeof(GreetingEventHandler).Assembly, typeof(ExceptionPolicyHandler <>).Assembly); services.AddSingleton <ILoggerFactory>(x => new SerilogLoggerFactory()); services.AddHostedService <ServiceActivatorHostedService>(); }) .UseConsoleLifetime() .Build(); await host.RunAsync(); }
private static async Task Main(string[] args) { Log.Logger = new LoggerConfiguration() .Enrich.FromLogContext() .WriteTo.Console() .CreateLogger(); var host = new HostBuilder() .ConfigureServices((hostContext, services) => { var connections = new Connection[] { new Connection <TaskCreatedEvent>(routingKey: new RoutingKey(nameof(TaskCreatedEvent)), isAsync: true), new Connection <TaskCompletedEvent>(routingKey: new RoutingKey(nameof(TaskCompletedEvent)), isAsync: true) }; var rmqConnection = new RmqMessagingGatewayConnection { AmpqUri = new AmqpUriSpecification(new Uri("amqp://*****:*****@localhost:5672")), Exchange = new Exchange("todo.backend.exchange") }; var rmqMessageConsumerFactory = new RmqMessageConsumerFactory(rmqConnection); services.AddServiceActivator(options => { options.Connections = connections; options.ChannelFactory = new ChannelFactory(rmqMessageConsumerFactory); options.BrighterMessaging = new BrighterMessaging(new InMemoryMessageStore(), new RmqMessageProducer(rmqConnection)); }).AutoFromAssemblies(); services.AddHostedService <ServiceActivatorHostedService>(); }) .ConfigureLogging(logging => { logging.ClearProviders(); logging.AddSerilog(dispose: true); }) .UseConsoleLifetime() .Build(); await host.RunAsync(); }
static void Main(string[] args) { Log.Logger = new LoggerConfiguration() .MinimumLevel.Debug() .Enrich.FromLogContext() .WriteTo.Console() .CreateLogger(); var serviceCollection = new ServiceCollection(); var rmqConnection = new RmqMessagingGatewayConnection { AmpqUri = new AmqpUriSpecification(new Uri("amqp://*****:*****@localhost:5672")), Exchange = new Exchange("paramore.brighter.exchange"), }; var producer = new RmqMessageProducer(rmqConnection); var rmqMessageConsumerFactory = new RmqMessageConsumerFactory(rmqConnection); serviceCollection.AddBrighter(options => { var outBox = new InMemoryOutbox(); options.ChannelFactory = new ChannelFactory(rmqMessageConsumerFactory); options.BrighterMessaging = new BrighterMessaging(outBox, producer); }).AutoFromAssemblies(); var serviceProvider = serviceCollection.BuildServiceProvider(); var commandProcessor = serviceProvider.GetService <IAmACommandProcessor>(); Console.WriteLine("Requesting Salutation..."); //blocking call commandProcessor.Call <GreetingRequest, GreetingReply>(new GreetingRequest { Name = "Ian", Language = "en-gb" }, 2000); Console.WriteLine("Done..."); Console.ReadLine(); }
/// <summary> /// Initializes a new instance of the <see cref="InputChannelFactory"/> class. /// </summary> /// <param name="messageConsumerFactory">The messageConsumerFactory.</param> public InputChannelFactory(RmqMessageConsumerFactory messageConsumerFactory, RmqMessageProducerFactory messageProducerFactory) { _messageConsumerFactory = messageConsumerFactory; _messageProducerFactory = messageProducerFactory; }
public static void Main(string[] args) { Log.Logger = new LoggerConfiguration() .WriteTo.LiterateConsole() .CreateLogger(); var container = new TinyIoCContainer(); var handlerFactory = new TinyIocHandlerFactory(container); var messageMapperFactory = new TinyIoCMessageMapperFactory(container); container.Register <IHandleRequests <GreetingEvent>, GreetingEventHandler>(); var subscriberRegistry = new SubscriberRegistry(); subscriberRegistry.Register <GreetingEvent, GreetingEventHandler>(); //create policies 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 policyRegistry = new PolicyRegistry { { CommandProcessor.RETRYPOLICY, retryPolicy }, { CommandProcessor.CIRCUITBREAKER, circuitBreakerPolicy } }; //create message mappers var messageMapperRegistry = new MessageMapperRegistry(messageMapperFactory) { { typeof(GreetingEvent), typeof(GreetingEventMessageMapper) } }; //create the gateway var rmqConnnection = new RmqMessagingGatewayConnection { AmpqUri = new AmqpUriSpecification(new Uri("amqp://*****:*****@localhost:5672/%2f")), Exchange = new Exchange("paramore.brighter.exchange"), }; var rmqMessageConsumerFactory = new RmqMessageConsumerFactory(rmqConnnection); var dispatcher = DispatchBuilder.With() .CommandProcessor(CommandProcessorBuilder.With() .Handlers(new HandlerConfiguration(subscriberRegistry, handlerFactory)) .Policies(policyRegistry) .NoTaskQueues() .RequestContextFactory(new InMemoryRequestContextFactory()) .Build()) .MessageMappers(messageMapperRegistry) .DefaultChannelFactory(new InputChannelFactory(rmqMessageConsumerFactory)) .Connections(new Connection[] { new Connection <GreetingEvent>( new ConnectionName("paramore.example.greeting"), new ChannelName("greeting.event"), new RoutingKey("greeting.event"), timeoutInMilliseconds: 200) }).Build(); dispatcher.Receive(); Console.WriteLine("Press Enter to stop ..."); Console.ReadLine(); dispatcher.End().Wait(); }
private static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .ConfigureHostConfiguration(configurationBuilder => { configurationBuilder.SetBasePath(Directory.GetCurrentDirectory()); configurationBuilder.AddJsonFile("appsettings.json", optional: true); configurationBuilder.AddJsonFile($"appsettings.{GetEnvironment()}.json", optional: true); configurationBuilder.AddEnvironmentVariables(prefix: "ASPNETCORE_"); //NOTE: Although not web, we use this to grab the environment configurationBuilder.AddEnvironmentVariables(prefix: "BRIGHTER_"); configurationBuilder.AddCommandLine(args); }) .ConfigureLogging((context, builder) => { builder.AddConsole(); builder.AddDebug(); }) .ConfigureServices((hostContext, services) => { ConfigureMigration(hostContext, services); ConfigureDapper(hostContext, services); var subscriptions = new Subscription[] { new RmqSubscription <GreetingMade>( new SubscriptionName("paramore.sample.salutationanalytics"), new ChannelName("SalutationAnalytics"), new RoutingKey("GreetingMade"), runAsync: true, timeoutInMilliseconds: 200, isDurable: true, makeChannels: OnMissingChannel.Create), //change to OnMissingChannel.Validate if you have infrastructure declared elsewhere }; var host = hostContext.HostingEnvironment.IsDevelopment() ? "localhost" : "rabbitmq"; var rmqConnection = new RmqMessagingGatewayConnection { AmpqUri = new AmqpUriSpecification(new Uri($"amqp://*****:*****@{host}:5672")), Exchange = new Exchange("paramore.brighter.exchange") }; var rmqMessageConsumerFactory = new RmqMessageConsumerFactory(rmqConnection); services.AddServiceActivator(options => { options.Subscriptions = subscriptions; options.ChannelFactory = new ChannelFactory(rmqMessageConsumerFactory); options.UseScoped = true; options.HandlerLifetime = ServiceLifetime.Scoped; options.MapperLifetime = ServiceLifetime.Singleton; options.CommandProcessorLifetime = ServiceLifetime.Scoped; options.PolicyRegistry = new SalutationPolicy(); }) .UseExternalBus(new RmqProducerRegistryFactory( new RmqMessagingGatewayConnection { AmpqUri = new AmqpUriSpecification(new Uri($"amqp://*****:*****@{host}:5672")), Exchange = new Exchange("paramore.brighter.exchange"), }, new RmqPublication[] { new RmqPublication { Topic = new RoutingKey("SalutationReceived"), MaxOutStandingMessages = 5, MaxOutStandingCheckIntervalMilliSeconds = 500, WaitForConfirmsTimeOutInMilliseconds = 1000, MakeChannels = OnMissingChannel.Create } } ).Create() ) .AutoFromAssemblies() .UseExternalInbox( ConfigureInbox(hostContext), new InboxConfiguration( scope: InboxScope.All, onceOnly: true, actionOnExists: OnceOnlyAction.Warn ) ); services.AddHostedService <ServiceActivatorHostedService>(); }) .UseConsoleLifetime();
public OrderService() { log4net.Config.XmlConfigurator.Configure(); var logger = LogProvider.For <OrderService>(); var container = new UnityContainer(); container.RegisterInstance(typeof(ILog), LogProvider.For <OrderService>(), new ContainerControlledLifetimeManager()); container.RegisterType <OrderUpdateCommandMessageMapper>(); container.RegisterType <OrderUpdateCommandHandler>(); container.RegisterType <IOrdersDAO, OrdersDAO>(); container.RegisterType <IAmAMailGateway, MailGateway>(); container.RegisterType <IAmAMailTranslator, MailTranslator>(); var handlerFactory = new UnityHandlerFactory(container); var messageMapperFactory = new UnityMessageMapperFactory(container); var subscriberRegistry = new SubscriberRegistry(); subscriberRegistry.Register <OrderUpdateCommand, OrderUpdateCommandHandler>(); //create policies 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 policyRegistry = new PolicyRegistry() { { CommandProcessor.RETRYPOLICY, retryPolicy }, { CommandProcessor.CIRCUITBREAKER, circuitBreakerPolicy } }; var commandProcessor = CommandProcessorBuilder.With() .Handlers(new HandlerConfiguration(subscriberRegistry, handlerFactory)) .Policies(policyRegistry) .Logger(logger) .NoTaskQueues() .RequestContextFactory(new InMemoryRequestContextFactory()) .Build(); //create message mappers var messageMapperRegistry = new MessageMapperRegistry(messageMapperFactory); messageMapperRegistry.Register <OrderUpdateCommand, OrderUpdateCommandMessageMapper>(); var rmqMessageConsumerFactory = new RmqMessageConsumerFactory(logger); _dispatcher = DispatchBuilder.With() .Logger(logger) .CommandProcessor(commandProcessor) .MessageMappers(messageMapperRegistry) .ChannelFactory(new InputChannelFactory(rmqMessageConsumerFactory)) .ConnectionsFromConfiguration() .Build(); }
public TaskMailerService() { log4net.Config.XmlConfigurator.Configure(); var logger = LogProvider.For <TaskMailerService>(); var container = new TinyIoCContainer(); container.Register <IAmAMessageMapper <TaskReminderCommand>, TaskReminderCommandMessageMapper>(); container.Register <MailTaskReminderHander, MailTaskReminderHander>(); container.Register <IAmAMailGateway, MailGateway>(); container.Register <ILog>(logger); container.Register <IAmAMailTranslator, MailTranslator>(); var handlerFactory = new TinyIocHandlerFactory(container); var messageMapperFactory = new TinyIoCMessageMapperFactory(container); var subscriberRegistry = new SubscriberRegistry(); subscriberRegistry.Register <TaskReminderCommand, MailTaskReminderHander>(); //create policies 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 policyRegistry = new PolicyRegistry() { { CommandProcessor.RETRYPOLICY, retryPolicy }, { CommandProcessor.CIRCUITBREAKER, circuitBreakerPolicy } }; var commandProcessor = CommandProcessorBuilder.With() .Handlers(new HandlerConfiguration(subscriberRegistry, handlerFactory)) .Policies(policyRegistry) .Logger(logger) .NoTaskQueues() .RequestContextFactory(new InMemoryRequestContextFactory()) .Build(); //create message mappers var messageMapperRegistry = new MessageMapperRegistry(messageMapperFactory) { { typeof(TaskReminderCommand), typeof(TaskReminderCommandMessageMapper) } }; var rmqMessageConsumerFactory = new RmqMessageConsumerFactory(logger); dispatcher = DispatchBuilder.With() .Logger(logger) .CommandProcessor(commandProcessor) .MessageMappers(messageMapperRegistry) .ChannelFactory(new InputChannelFactory(rmqMessageConsumerFactory)) .ConnectionsFromConfiguration() .Build(); }
/// <summary> /// Initializes a new instance of the <see cref="InputChannelFactory"/> class. /// </summary> /// <param name="messageConsumerFactory">The messageConsumerFactory.</param> public InputChannelFactory(RmqMessageConsumerFactory messageConsumerFactory) { _messageConsumerFactory = messageConsumerFactory; }
public GreetingService() { log4net.Config.XmlConfigurator.Configure(new FileInfo("log4net.config")); var container = new TinyIoCContainer(); var handlerFactory = new TinyIocHandlerFactory(container); var messageMapperFactory = new TinyIoCMessageMapperFactory(container); container.Register <IHandleRequests <GreetingEvent>, GreetingEventHandler>(); var subscriberRegistry = new SubscriberRegistry(); subscriberRegistry.Register <GreetingEvent, GreetingEventHandler>(); //create policies 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 policyRegistry = new PolicyRegistry() { { CommandProcessor.RETRYPOLICY, retryPolicy }, { CommandProcessor.CIRCUITBREAKER, circuitBreakerPolicy } }; //create message mappers var messageMapperRegistry = new MessageMapperRegistry(messageMapperFactory) { { typeof(GreetingEvent), typeof(GreetingEventMessageMapper) } }; //create the gateway var rmqConnnection = new RmqMessagingGatewayConnection { AmpqUri = new AmqpUriSpecification(new Uri("amqp://*****:*****@localhost:5672/%2f")), Exchange = new Exchange("paramore.brighter.exchange"), }; var rmqMessageConsumerFactory = new RmqMessageConsumerFactory(rmqConnnection); var rmqMessageProducerFactory = new RmqMessageProducerFactory(rmqConnnection); // < add connectionName = "paramore.example.greeting" channelName = "greeting." routingKey = "greeting.command" dataType = "Greetings.Ports.Commands.GreetingEvent" timeOutInMilliseconds = "200" /> // Service Activator connections var connections = new List <paramore.brighter.serviceactivator.Connection> { new paramore.brighter.serviceactivator.Connection( new ConnectionName("paramore.example.greeting"), new InputChannelFactory(rmqMessageConsumerFactory, rmqMessageProducerFactory), typeof(GreetingEvent), new ChannelName("greeting.event"), "greeting.event", timeoutInMilliseconds: 200) }; var builder = DispatchBuilder .With() .CommandProcessor(CommandProcessorBuilder.With() .Handlers(new HandlerConfiguration(subscriberRegistry, handlerFactory)) .Policies(policyRegistry) .NoTaskQueues() .RequestContextFactory(new InMemoryRequestContextFactory()) .Build() ) .MessageMappers(messageMapperRegistry) .ChannelFactory(new InputChannelFactory(rmqMessageConsumerFactory, rmqMessageProducerFactory)) .Connections(connections); _dispatcher = builder.Build(); }
public MeetingAndManagementService() { log4net.Config.XmlConfigurator.Configure(); var container = new TinyIoCContainer(); var handlerFactory = new TinyIocHandlerFactory(container); var messageMapperFactory = new TinyIoCMessageMapperFactory(container); container.Register <IHandleRequests <GreetingCommand>, GreetingCommandHandler>(); var subscriberRegistry = new SubscriberRegistry(); subscriberRegistry.Register <GreetingCommand, GreetingCommandHandler>(); //create policies 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 policyRegistry = new PolicyRegistry() { { CommandProcessor.RETRYPOLICY, retryPolicy }, { CommandProcessor.CIRCUITBREAKER, circuitBreakerPolicy } }; //create message mappers var messageMapperRegistry = new MessageMapperRegistry(messageMapperFactory) { { typeof(GreetingCommand), typeof(GreetingCommandMessageMapper) } }; //create the gateway var rmqMessageConsumerFactory = new RmqMessageConsumerFactory(); var rmqMessageProducerFactory = new RmqMessageProducerFactory(); var builder = DispatchBuilder .With() .CommandProcessor(CommandProcessorBuilder.With() .Handlers(new HandlerConfiguration(subscriberRegistry, handlerFactory)) .Policies(policyRegistry) .NoTaskQueues() .RequestContextFactory(new InMemoryRequestContextFactory()) .Build() ) .MessageMappers(messageMapperRegistry) .ChannelFactory(new InputChannelFactory(rmqMessageConsumerFactory, rmqMessageProducerFactory)) .ConnectionsFromConfiguration(); _dispatcher = builder.Build(); var controlBusBuilder = ControlBusReceiverBuilder .With() .Dispatcher(_dispatcher) .ChannelFactory(new InputChannelFactory(rmqMessageConsumerFactory, rmqMessageProducerFactory)) as ControlBusReceiverBuilder; _controlDispatcher = builder.Build(); container.Register <IAmAControlBusSender>(new ControlBusSenderFactory().Create( new MsSqlMessageStore( new MsSqlMessageStoreConfiguration( "DataSource=\"" + Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().GetName().CodeBase.Substring(8)), "App_Data\\MessageStore.sdf") + "\"", "Messages", MsSqlMessageStoreConfiguration.DatabaseType.SqlCe) ), new RmqMessageProducer(container.Resolve <ILog>()))); }
public ManagementAndMonitoringService() { log4net.Config.XmlConfigurator.Configure(); var container = new TinyIoCContainer(); var handlerFactory = new TinyIocHandlerFactory(container); var messageMapperFactory = new TinyIoCMessageMapperFactory(container); container.Register <IHandleRequests <GreetingCommand>, GreetingCommandHandler>(); var subscriberRegistry = new SubscriberRegistry(); subscriberRegistry.Register <GreetingCommand, GreetingCommandHandler>(); //create policies 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 policyRegistry = new PolicyRegistry() { { CommandProcessor.RETRYPOLICY, retryPolicy }, { CommandProcessor.CIRCUITBREAKER, circuitBreakerPolicy } }; //create message mappers var messageMapperRegistry = new MessageMapperRegistry(messageMapperFactory) { { typeof(GreetingCommand), typeof(GreetingCommandMessageMapper) } }; var rmqGatewayMessages = new RmqMessagingGatewayConnection { AmpqUri = new AmqpUriSpecification(new Uri("amqp://*****:*****@localhost:5672/%2f")), Exchange = new Exchange("paramore.brighter.exchange"), }; var rmqGatewayMonitoring = new RmqMessagingGatewayConnection { AmpqUri = new AmqpUriSpecification(new Uri("amqp://*****:*****@localhost:5672/%2f")), Exchange = new Exchange("paramore.brighter.exchange"), }; //create the gateway var rmqMessageConsumerFactory = new RmqMessageConsumerFactory(rmqGatewayMessages); var rmqMessageProducerFactory = new RmqMessageProducerFactory(rmqGatewayMessages); var connections = new List <Connection> { }; var builder = DispatchBuilder .With() .CommandProcessor(CommandProcessorBuilder.With() .Handlers(new HandlerConfiguration(subscriberRegistry, handlerFactory)) .Policies(policyRegistry) .NoTaskQueues() .RequestContextFactory(new InMemoryRequestContextFactory()) .Build() ) .MessageMappers(messageMapperRegistry) .DefaultChannelFactory(new InputChannelFactory(rmqMessageConsumerFactory)) .Connections(connections); _dispatcher = builder.Build(); var controlBusBuilder = ControlBusReceiverBuilder .With() .Dispatcher(_dispatcher) .ProducerFactory(rmqMessageProducerFactory) .ChannelFactory(new InputChannelFactory(rmqMessageConsumerFactory)) as ControlBusReceiverBuilder; _controlDispatcher = controlBusBuilder.Build(Environment.MachineName + "." + "ManagementAndMonitoring"); container.Register <IAmAControlBusSender>(new ControlBusSenderFactory().Create( new SqliteMessageStore( new SqliteMessageStoreConfiguration( "DataSource=\"" + Path.Combine(Path.GetDirectoryName(typeof(GreetingCommand).GetTypeInfo().Assembly.CodeBase.Substring(8)), "App_Data\\MessageStore.sdf") + "\"", "Messages") ), new RmqMessageProducer(rmqGatewayMonitoring))); }
public PersonService() { log4net.Config.XmlConfigurator.Configure(); //injecao de dependencia var container = new TinyIoCContainer(); var handlerFactory = new TinyIocHandlerFactory(container); var messageMapperFactory = new TinyIoCMessageMapperFactory(container); container.Register <IHandleRequests <EventoPersonalisado>, PersonEventHandler>(); var subscriberRegistry = new SubscriberRegistry(); subscriberRegistry.Register <EventoPersonalisado, PersonEventHandler>(); //create policies 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 policyRegistry = new PolicyRegistry { { CommandProcessor.RETRYPOLICY, retryPolicy }, { CommandProcessor.CIRCUITBREAKER, circuitBreakerPolicy } }; //mapeando objetos var messageMapperRegistry = new MessageMapperRegistry(messageMapperFactory) { { typeof(EventoPersonalisado), typeof(PersonEventMessageMapper) } }; //gateway de conexao var rmqConnnection = new RmqMessagingGatewayConnection { AmpqUri = new AmqpUriSpecification(new Uri("amqp://*****:*****@localhost:5672/%2f")), Exchange = new Exchange("paramore.brighter.exchange"), }; var rmqMessageConsumerFactory = new RmqMessageConsumerFactory(rmqConnnection); _dispatcher = DispatchBuilder.With() .CommandProcessor(CommandProcessorBuilder.With() .Handlers(new HandlerConfiguration(subscriberRegistry, handlerFactory)) .Policies(policyRegistry) .NoTaskQueues() .RequestContextFactory(new InMemoryRequestContextFactory()) .Build()) .MessageMappers(messageMapperRegistry) .DefaultChannelFactory(new ChannelFactory(rmqMessageConsumerFactory)) .Connections(new[] { new Connection <EventoPersonalisado>( new ConnectionName("paramore.example.Person"), new ChannelName("order"), new RoutingKey("order"), timeoutInMilliseconds: 200) }).Build(); }
public TaskMailerService() { log4net.Config.XmlConfigurator.Configure(); var container = new TinyIoCContainer(); container.Register <IAmAMessageMapper <TaskReminderCommand>, Tasks.Ports.TaskReminderCommandMessageMapper>(); container.Register <MailTaskReminderHandler, MailTaskReminderHandler>(); container.Register <IAmAMailGateway, MailGateway>(); container.Register <IAmAMailTranslator, MailTranslator>(); var handlerFactory = new TinyIocHandlerFactory(container); var messageMapperFactory = new TinyIoCMessageMapperFactory(container); var subscriberRegistry = new SubscriberRegistry(); subscriberRegistry.Register <TaskReminderCommand, MailTaskReminderHandler>(); //create policies 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 policyRegistry = new PolicyRegistry() { { CommandProcessor.RETRYPOLICY, retryPolicy }, { CommandProcessor.CIRCUITBREAKER, circuitBreakerPolicy } }; var messageMapperRegistry = new MessageMapperRegistry(messageMapperFactory) { { typeof(TaskReminderCommand), typeof(Tasks.Ports.TaskReminderCommandMessageMapper) }, { typeof(TaskReminderSentEvent), typeof(TaskMailer.Ports.TaskReminderSentEventMapper) } }; var rmqConnnection = new RmqMessagingGatewayConnection { AmpqUri = new AmqpUriSpecification(new Uri("amqp://*****:*****@localhost:5672/%2f")), Exchange = new Exchange("paramore.brighter.exchange"), }; var commandProcessor = CommandProcessorBuilder.With() .Handlers(new HandlerConfiguration(subscriberRegistry, handlerFactory)) .Policies(policyRegistry) .TaskQueues(new MessagingConfiguration(new TemporaryMessageStore(), new RmqMessageProducer(rmqConnnection), messageMapperRegistry)) .RequestContextFactory(new InMemoryRequestContextFactory()) .Build(); container.Register <IAmACommandProcessor>(commandProcessor); var rmqMessageConsumerFactory = new RmqMessageConsumerFactory(rmqConnnection); var rmqMessageProducerFactory = new RmqMessageProducerFactory(rmqConnnection); var inputChannelFactory = new InputChannelFactory(new RmqMessageConsumerFactory(rmqConnnection), new RmqMessageProducerFactory(rmqConnnection)); var connections = new List <Connection> { // Events with mapper and handler overrides new Connection(new ConnectionName("Task.Reminder"), inputChannelFactory, typeof(TaskReminderCommand), new ChannelName("Task.Reminder"), "Task.Reminder", noOfPerformers: 1, timeoutInMilliseconds: 200), }; _dispatcher = DispatchBuilder.With() .CommandProcessor(commandProcessor) .MessageMappers(messageMapperRegistry) .ChannelFactory(new InputChannelFactory(rmqMessageConsumerFactory, rmqMessageProducerFactory)) .Connections(connections) .Build(); }