示例#1
0
        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);
            });
        }
示例#2
0
        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();
        });
示例#3
0
 public RequestDispatchActivity(ConsumeContext context, IOptions <CourierServiceSettings> options, ILogger <RequestDispatchActivity> logger)
 {
     _context  = context;
     _logger   = logger;
     _settings = options.Value;
 }