void ConfigureEvents(CourierServiceSettings settings) { Event(() => RequestCourierDispatchEvent, e => e.CorrelateById(context => context.Message.OrderId)); Event(() => IdentifyCourierForDispatchEvent, e => e.CorrelateById(context => context.Message.OrderId)); Event(() => CourierIdentifiedForDispatchEvent, e => e.CorrelateById(context => context.Message.CourierId)); Event(() => CourierNotIdentifiedForDispatchEvent, e => e.CorrelateById(context => context.Message.OrderId)); Event(() => CourierDispatchedEvent, e => e.CorrelateById(context => context.Message.CourierId)); Event(() => CourierDispatchConfirmedEvent, e => e.CorrelateById(context => context.Message.CourierId)); Event(() => CourierDispatchDeclinedEvent, e => e.CorrelateById(context => context.Message.CourierId)); Event(() => CourierEnRouteRestaurantEvent, e => e.CorrelateById(context => context.Message.CourierId)); Event(() => CourierArrivedAtRestaurantEvent, e => e.CorrelateById(context => context.Message.CourierId)); Event(() => OrderPickedUpEvent, e => e.CorrelateById(context => context.Message.CourierId)); Event(() => CourierEnRouteToCustomerEvent, e => e.CorrelateById(context => context.Message.CourierId)); Event(() => CourierArrivedAtCustomerEvent, e => e.CorrelateById(context => context.Message.CourierId)); Event(() => DeliveringOrderEvent, e => e.CorrelateById(context => context.Message.CourierId)); Event(() => OrderDeliveredEvent, e => e.CorrelateById(context => context.Message.CourierId)); Event(() => CourierDispatchCanceledEvent, e => e.CorrelateById(context => context.Message.CourierId)); Event(() => OrderReadyForDeliveryEvent, e => e.CorrelateById(context => context.Message.OrderId)); Event(() => OrderExpiredEvent, e => e.CorrelateById(context => context.Message.OrderId)); Event(() => OrderCanceledEvent, e => e.CorrelateById(context => context.Message.OrderId)); Schedule(() => OrderCompletionTimeout, instance => instance.OrderCompletionTimeoutTokenId, s => { int timeInSeconds = settings.CourierWaitUponArrivalTimeInSeconds; s.Delay = TimeSpan.FromSeconds(timeInSeconds > 0 ? timeInSeconds : 15); s.Received = r => r.CorrelateById(context => context.Message.OrderId); }); }
static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder() .UseSerilog((host, log) => { string appBin = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); log.MinimumLevel.Information(); log.MinimumLevel.Override("Microsoft", LogEventLevel.Warning); log.WriteTo.File($"{appBin}/log/log-{DateTime.Now:yyMMdd_HHmmss}.txt"); log.WriteTo.Console(LogEventLevel.Debug); }) .ConfigureAppConfiguration((host, config) => { config.Sources.Clear(); config.AddJsonFile("appsettings.json", false); }) .ConfigureServices((host, services) => { services.AddSingleton <IGrpcClient <ICourierDispatcher>, CourierDispatcherClient>(); services.AddSingleton(x => { var config = new GrpcClientSettings(); host.Configuration.Bind("Grpc", config); return(config); }); services.AddSingleton(x => { var config = new RabbitMqTransportSettings(); host.Configuration.Bind("RabbitMqTransport", config); return(config); }); services.AddSingleton(x => { var config = new CourierServiceSettings(); host.Configuration.Bind("Application", config); return(config); }); services.AddMassTransit(x => { x.SetKebabCaseEndpointNameFormatter(); x.AddConsumer(typeof(DispatchConsumer), typeof(DispatchConsumerDefinition)); x.AddConsumer(typeof(DispatchConfirmationConsumer), typeof(DispatchConfirmationConsumerDefinition)); x.AddConsumer(typeof(OrderDeliveryConsumer), typeof(OrderDeliveryConsumerDefinition)); x.AddConsumer(typeof(PickUpOrderConsumer), typeof(PickUpOrderConsumerDefinition)); x.AddConsumer(typeof(EnRouteToRestaurantConsumer), typeof(EnRouteToRestaurantConsumerDefinition)); x.AddConsumer(typeof(DispatchDeclinedConsumer), typeof(DispatchDeclinedConsumerDefinition)); x.AddConsumer(typeof(EnRouteToCustomerConsumer), typeof(EnRouteToCustomerConsumerDefinition)); x.AddConsumer(typeof(DispatchIdentificationConsumer), typeof(DispatchIdentificationConsumerDefinition)); x.AddConsumer(typeof(DispatchCancellationConsumer), typeof(DispatchCancellationConsumerDefinition)); x.AddSagaStateMachine(typeof(CourierStateMachine), typeof(CourierStateDefinition)); Uri schedulerEndpoint = new Uri("queue:quartz"); x.AddMessageScheduler(schedulerEndpoint); x.UsingRabbitMq((context, cfg) => { var settings = context.GetService <RabbitMqTransportSettings>(); cfg.Host(settings.Host, settings.VirtualHost, h => { h.Username(settings.Username); h.Password(settings.Password); }); cfg.UseMessageScheduler(schedulerEndpoint); cfg.ConfigureEndpoints(context); // cfg.UseMessageRetry(x => x.SetRetryPolicy(new RetryPolicyFactory())); }); x.AddSagaStateMachine <CourierStateMachine, CourierState>() .EntityFrameworkRepository(r => { r.ConcurrencyMode = ConcurrencyMode.Optimistic; r.AddDbContext <DbContext, CourierServiceDbContext>((provider, builder) => { builder.UseNpgsql(host.Configuration.GetConnectionString("OrdersConnection"), m => { m.MigrationsAssembly(Assembly.GetExecutingAssembly().GetName().Name); m.MigrationsHistoryTable($"__{nameof(CourierServiceDbContext)}"); }); }); }); }); services.AddMassTransitHostedService(); });
public RequestDispatchActivity(ConsumeContext context, IOptions <CourierServiceSettings> options, ILogger <RequestDispatchActivity> logger) { _context = context; _logger = logger; _settings = options.Value; }