Exemplo n.º 1
0
        protected override void ConfigureInMemoryBus(IInMemoryBusFactoryConfigurator configurator)
        {
            base.ConfigureInMemoryBus(configurator);

            var options = new ServiceInstanceOptions()
                          .EnableInstanceEndpoint()
                          .SetEndpointNameFormatter(KebabCaseEndpointNameFormatter.Instance);

            configurator.ServiceInstance(options, instance =>
            {
                instance.ConfigureJobServiceEndpoints(x =>
                {
                    x.UseEntityFrameworkCoreSagaRepository(() => new JobServiceSagaDbContextFactory().CreateDbContext(DbContextOptionsBuilder),
                                                           RawSqlLockStatements);
                });

                instance.ReceiveEndpoint(instance.EndpointNameFormatter.Message <GrindTheGears>(), e =>
                {
                    e.Consumer(() => new GrindTheGearsConsumer(), cfg =>
                    {
                        cfg.Options <JobOptions <GrindTheGears> >(jobOptions => jobOptions.SetJobTimeout(TimeSpan.FromSeconds(90)));
                    });
                });
            });
        }
Exemplo n.º 2
0
        protected override void ConfigureInMemoryBus(IInMemoryBusFactoryConfigurator configurator)
        {
            base.ConfigureInMemoryBus(configurator);

            var options = new ServiceInstanceOptions()
                          .EnableInstanceEndpoint()
                          .SetEndpointNameFormatter(KebabCaseEndpointNameFormatter.Instance);

            configurator.ServiceInstance(options, instance =>
            {
                instance.ConfigureJobServiceEndpoints(x =>
                {
                    x.SuspectJobRetryCount = 1;
                    x.SuspectJobRetryDelay = TimeSpan.FromSeconds(1);
                });

                instance.ReceiveEndpoint(instance.EndpointNameFormatter.Message <GrindTheGears>(), e =>
                {
                    e.Consumer(() => new GrindTheGearsConsumer(), cfg =>
                    {
                        cfg.Options <JobOptions <GrindTheGears> >(jobOptions => jobOptions.SetJobTimeout(TimeSpan.FromSeconds(90)));
                    });
                });
            });
        }
Exemplo n.º 3
0
        public static async Task Main()
        {
            var busControl = Bus.Factory.CreateUsingRabbitMq(cfg =>
            {
                var options = new ServiceInstanceOptions()
                              .EnableInstanceEndpoint();

                cfg.ServiceInstance(options, instance =>
                {
                    instance.ConfigureJobServiceEndpoints();

                    var queueName = instance.EndpointNameFormatter.Consumer <ConvertVideoJobConsumer>();

                    instance.ReceiveEndpoint(queueName, e =>
                    {
                        e.Consumer(() => new ConvertVideoJobConsumer(), c =>
                        {
                            c.Options <JobOptions <ConvertVideo> >(options => options
                                                                   .SetJobTimeout(TimeSpan.FromMinutes(15))
                                                                   .SetConcurrentJobLimit(10));
                        });
                    });
                });
            });
        }
        /// <summary>
        /// Configure a service instance, which supports one or more receive endpoints, all of which are managed by conductor.
        /// </summary>
        /// <param name="configurator"></param>
        /// <param name="options"></param>
        /// <param name="configure"></param>
        public static void ServiceInstance <TEndpointConfigurator>(this IReceiveConfigurator <TEndpointConfigurator> configurator,
                                                                   ServiceInstanceOptions options, Action <IServiceInstanceConfigurator <TEndpointConfigurator> > configure)
            where TEndpointConfigurator : IReceiveEndpointConfigurator
        {
            var transportConfigurator = Cached <TEndpointConfigurator> .Instance;

            var instance = new ServiceInstance();

            if (options.InstanceEndpointEnabled)
            {
                var definition = new InstanceEndpointDefinition(instance);
                configurator.ReceiveEndpoint(definition, options.EndpointNameFormatter, instanceEndpointConfigurator =>
                {
                    var instanceConfigurator = new ServiceInstanceConfigurator <TEndpointConfigurator>(configurator, transportConfigurator, instance, options,
                                                                                                       instanceEndpointConfigurator);

                    configure?.Invoke(instanceConfigurator);
                });
            }
            else
            {
                var instanceConfigurator = new ServiceInstanceConfigurator <TEndpointConfigurator>(configurator, transportConfigurator, instance, options);

                configure?.Invoke(instanceConfigurator);
            }
        }
        protected override void ConfigureInMemoryBus(IInMemoryBusFactoryConfigurator configurator)
        {
            base.ConfigureInMemoryBus(configurator);

            var options = new ServiceInstanceOptions()
                          .EnableInstanceEndpoint()
                          .SetEndpointNameFormatter(KebabCaseEndpointNameFormatter.Instance);

            configurator.ServiceInstance(options, instance =>
            {
                instance.ConfigureJobServiceEndpoints(x =>
                {
                    x.SlotWaitTime       = TimeSpan.FromSeconds(1);
                    x.SagaPartitionCount = 16;
                    x.FinalizeCompleted  = true;

                    x.UseAzureTableSagaRepository(() => TestCloudTable);
                });

                instance.ReceiveEndpoint(instance.EndpointNameFormatter.Message <CrunchTheNumbers>(), e =>
                {
                    e.Consumer(() => new CrunchTheNumbersConsumer(), cfg =>
                    {
                        cfg.Options <JobOptions <CrunchTheNumbers> >(o => o.SetJobTimeout(TimeSpan.FromSeconds(90)).SetConcurrentJobLimit(3));
                    });
                    e.UseMessageScheduler(e.InputAddress);
                });
            });
        }
Exemplo n.º 6
0
        protected Common_Conductor(bool instanceEndpoint)
        {
            Options = new ServiceInstanceOptions();

            if (instanceEndpoint)
            {
                Options.EnableInstanceEndpoint();
            }
        }
 public ServiceInstanceConfigurator(IBusFactoryConfigurator <TEndpointConfigurator> configurator,
                                    IServiceInstanceTransportConfigurator <TEndpointConfigurator> transportConfigurator,
                                    IServiceInstance instance,
                                    ServiceInstanceOptions options,
                                    TEndpointConfigurator instanceEndpointConfigurator = default)
 {
     _configurator          = configurator;
     _transportConfigurator = transportConfigurator;
     _instance = instance;
     _options  = options;
     _instanceEndpointConfigurator = instanceEndpointConfigurator;
 }
Exemplo n.º 8
0
        protected override void ConfigureGrpcBus(IGrpcBusFactoryConfigurator configurator)
        {
            configurator.UseDelayedMessageScheduler();

            var options = new ServiceInstanceOptions()
                          .SetEndpointNameFormatter(KebabCaseEndpointNameFormatter.Instance);

            configurator.ServiceInstance(options, instance =>
            {
                instance.ConfigureJobServiceEndpoints(_jobServiceOptions);
            });
        }
        private static void ConfigureRabbitMq(IBusRegistrationContext context, IRabbitMqBusFactoryConfigurator configurator)
        {
            var massTransitRabbitConfig = context.GetService <MassTransitRabbitConfig>();

            var clusterInternalName = massTransitRabbitConfig.ClusterName;
            var virtualHost         = massTransitRabbitConfig.VirtualHost;
            var connectionName      =
                $"{Assembly.GetEntryAssembly()?.GetName().Name} ({Environment.MachineName})";

            configurator.Host(
                new UriBuilder("rabbitmq", clusterInternalName, massTransitRabbitConfig.ClusterPort, virtualHost)
                .Uri,
                connectionName,
                hostConfigurator =>
            {
                hostConfigurator.Username(massTransitRabbitConfig.UserName);
                hostConfigurator.Password(massTransitRabbitConfig.Password);
                hostConfigurator.PublisherConfirmation = true;
                hostConfigurator.UseCluster(
                    cluster =>
                {
                    foreach (var node in massTransitRabbitConfig.ClusterNodes)
                    {
                        cluster.Node(node);
                    }
                });
                if (massTransitRabbitConfig.UseSSL)
                {
                    hostConfigurator.UseSsl(sslConfigurator => sslConfigurator.Protocol = SslProtocols.None);
                }
            });

            configurator.UseDelayedMessageScheduler();

            configurator.UseSerilogEnricher();

            configurator.UseRetry(
                retryConfig => retryConfig.Exponential(
                    5,
                    TimeSpan.FromMilliseconds(200),
                    TimeSpan.FromSeconds(60),
                    TimeSpan.FromSeconds(1)));

            var serviceInstanceOptions = new ServiceInstanceOptions()
                                         .EnableJobServiceEndpoints()
                                         .SetEndpointNameFormatter(KebabCaseEndpointNameFormatter.Instance);

            configurator.ConfigureServiceEndpoints(context, serviceInstanceOptions);

            // configurator.ConfigureEndpoints(context);
        }
Exemplo n.º 10
0
        protected override void ConfigureInMemoryBus(IInMemoryBusFactoryConfigurator configurator)
        {
            var options = new ServiceInstanceOptions()
                          .SetEndpointNameFormatter(KebabCaseEndpointNameFormatter.Instance);

            configurator.ServiceInstance(options, instance =>
            {
                var serviceEndpointName = instance.EndpointNameFormatter.Consumer <DeployPayloadConsumer>();

                instance.ReceiveEndpoint(serviceEndpointName, x =>
                {
                    x.Consumer <DeployPayloadConsumer>();
                });
            });
        }
        /// <summary>
        /// Configure a service instance for use with the job service
        /// </summary>
        /// <param name="configurator"></param>
        /// <param name="options"></param>
        /// <param name="configure"></param>
        public static void ServiceInstance <TEndpointConfigurator>(this IBusFactoryConfigurator <TEndpointConfigurator> configurator,
                                                                   ServiceInstanceOptions options, Action <IServiceInstanceConfigurator <TEndpointConfigurator> > configure)
            where TEndpointConfigurator : IReceiveEndpointConfigurator
        {
            var instance = new ServiceInstance();

            var definition = new InstanceEndpointDefinition(instance);

            configurator.ReceiveEndpoint(definition, options.EndpointNameFormatter, endpointConfigurator =>
            {
                var instanceConfigurator = new ServiceInstanceConfigurator <TEndpointConfigurator>(configurator, options, endpointConfigurator);

                configure?.Invoke(instanceConfigurator);
            });
        }
Exemplo n.º 12
0
        protected override void ConfigureRabbitMqBus(IRabbitMqBusFactoryConfigurator configurator)
        {
            configurator.UseDelayedExchangeMessageScheduler();

            var options = new ServiceInstanceOptions()
                          .SetEndpointNameFormatter(KebabCaseEndpointNameFormatter.Instance);

            configurator.ServiceInstance(options, instance =>
            {
                instance.ConfigureJobServiceEndpoints();

                instance.ReceiveEndpoint(instance.EndpointNameFormatter.Message <GrindTheGears>(), e =>
                {
                    e.Consumer(() => new GrindTheGearsConsumer());
                });
            });
        }
Exemplo n.º 13
0
        protected override void ConfigureInMemoryBus(IInMemoryBusFactoryConfigurator configurator)
        {
            base.ConfigureInMemoryBus(configurator);

            var options = new ServiceInstanceOptions()
                          .SetEndpointNameFormatter(KebabCaseEndpointNameFormatter.Instance);

            configurator.ServiceInstance(options, instance =>
            {
                instance.ConfigureJobServiceEndpoints();

                instance.ReceiveEndpoint(instance.EndpointNameFormatter.Message <CrunchTheNumbers>(), e =>
                {
                    e.Consumer(() => new CrunchTheNumbersConsumer());
                });
            });
        }
Exemplo n.º 14
0
        protected override void ConfigureGrpcBus(IGrpcBusFactoryConfigurator configurator)
        {
            configurator.UseDelayedMessageScheduler();

            var options = new ServiceInstanceOptions()
                          .SetEndpointNameFormatter(KebabCaseEndpointNameFormatter.Instance);

            configurator.ServiceInstance(options, instance =>
            {
                instance.ConfigureJobServiceEndpoints(_jobServiceOptions);

                instance.ReceiveEndpoint(instance.EndpointNameFormatter.Message <EncodeVideo>(), e =>
                {
                    e.Consumer(() => new EncodeVideoConsumer(LoggerFactory.CreateLogger("EncodeVideo")), x =>
                    {
                        x.Options <JobOptions <EncodeVideo> >(o => o.SetConcurrentJobLimit(5));
                    });
                });
            });
        }
Exemplo n.º 15
0
        static IBusControl ConfigureBus(IServiceProvider provider)
        {
            var options = provider.GetRequiredService <IOptions <AppConfig> >().Value;

            return(Bus.Factory.CreateUsingRabbitMq(cfg =>
            {
                var host = cfg.Host(options.Host, options.VirtualHost, h =>
                {
                    h.Username(options.Username);
                    h.Password(options.Password);
                });

                cfg.UseInMemoryScheduler();

                var serviceInstanceOptions = new ServiceInstanceOptions()
                                             .SetEndpointNameFormatter(KebabCaseEndpointNameFormatter.Instance);

                cfg.ConfigureServiceEndpoints(provider, serviceInstanceOptions);
            }));
        }
Exemplo n.º 16
0
        protected override void ConfigureInMemoryBus(IInMemoryBusFactoryConfigurator configurator)
        {
            base.ConfigureInMemoryBus(configurator);

            var options = new ServiceInstanceOptions()
                          .SetEndpointNameFormatter(KebabCaseEndpointNameFormatter.Instance);

            configurator.ServiceInstance(options, instance =>
            {
                instance.ConfigureJobServiceEndpoints(x =>
                {
                    x.UseEntityFrameworkCoreSagaRepository(() => new JobServiceSagaDbContextFactory().CreateDbContext(DbContextOptionsBuilder),
                                                           RawSqlLockStatements);
                });

                instance.ReceiveEndpoint(instance.EndpointNameFormatter.Message <CrunchTheNumbers>(), e =>
                {
                    e.Consumer(() => new CrunchTheNumbersConsumer());
                });
            });
        }
Exemplo n.º 17
0
        protected override void ConfigureInMemoryBus(IInMemoryBusFactoryConfigurator configurator)
        {
            base.ConfigureInMemoryBus(configurator);

            var options = new ServiceInstanceOptions()
                          .SetEndpointNameFormatter(KebabCaseEndpointNameFormatter.Instance);

            configurator.ServiceInstance(options, instance =>
            {
                instance.ConfigureJobServiceEndpoints();

                instance.ReceiveEndpoint(instance.EndpointNameFormatter.Message <CrunchTheNumbers>(), e =>
                {
                    e.Consumer(() => new CrunchTheNumbersConsumer(), cfg =>
                    {
                        cfg.Options <JobOptions <CrunchTheNumbers> >(jobOptions => jobOptions.SetJobTimeout(TimeSpan.FromSeconds(90)));
                    });

                    _serviceAddress = e.InputAddress;
                });
            });
        }
Exemplo n.º 18
0
        protected override void ConfigureInMemoryBus(IInMemoryBusFactoryConfigurator configurator)
        {
            base.ConfigureInMemoryBus(configurator);

            configurator.UsePrometheusMetrics(serviceName: "unit_test");

            var options = new ServiceInstanceOptions()
                          .SetEndpointNameFormatter(KebabCaseEndpointNameFormatter.Instance);

            configurator.ServiceInstance(options, instance =>
            {
                instance.ConfigureJobServiceEndpoints();

                instance.ReceiveEndpoint(instance.EndpointNameFormatter.Message <TheJob>(), e =>
                {
                    e.Consumer(() => new TestJobConsumer(), cfg =>
                    {
                        cfg.Options <JobOptions <TheJob> >(jobOptions => jobOptions.SetJobTimeout(TimeSpan.FromSeconds(90)));
                    });
                });
            });
        }
Exemplo n.º 19
0
        protected override void ConfigureInMemoryBus(IInMemoryBusFactoryConfigurator configurator)
        {
            base.ConfigureInMemoryBus(configurator);

            var options = new ServiceInstanceOptions()
                          .SetEndpointNameFormatter(KebabCaseEndpointNameFormatter.Instance);

            configurator.ServiceInstance(options, instance =>
            {
                var busRegistrationContext = _provider.GetRequiredService <IBusRegistrationContext>();

                instance.ConfigureJobServiceEndpoints(x =>
                {
                    x.ConfigureSagaRepositories(busRegistrationContext);
                });

                instance.ReceiveEndpoint(instance.EndpointNameFormatter.Message <CrunchTheNumbers>(), e =>
                {
                    e.ConfigureConsumer <CrunchTheNumbersConsumer>(busRegistrationContext);
                });
            });
        }
Exemplo n.º 20
0
        protected override void ConfigureInMemoryBus(IInMemoryBusFactoryConfigurator configurator)
        {
            base.ConfigureInMemoryBus(configurator);

            var options = new ServiceInstanceOptions()
                          .SetEndpointNameFormatter(KebabCaseEndpointNameFormatter.Instance);

            configurator.ServiceInstance(options, instance =>
            {
                instance.ConfigureJobServiceEndpoints(x =>
                {
                    x.SlotWaitTime = TimeSpan.FromSeconds(1);
                });

                instance.ReceiveEndpoint(instance.EndpointNameFormatter.Message <CrunchTheNumbers>(), e =>
                {
                    e.Consumer(() => new CrunchTheNumbersConsumer(), cfg =>
                    {
                        cfg.Options <JobOptions <CrunchTheNumbers> >(o => o.SetJobTimeout(TimeSpan.FromSeconds(90)).SetConcurrentJobLimit(3));
                    });
                });
            });
        }
        /// <summary>
        /// Configure the Conductor service endpoints for all defined consumer, saga, and activity types.
        /// </summary>
        /// <param name="configurator">The <see cref="IBusFactoryConfigurator" /> for the bus being configured</param>
        /// <param name="registration">The registration for this bus instance</param>
        /// <param name="options">Optional service instance options to start</param>
        /// <typeparam name="T">The bus factory type (depends upon the transport)</typeparam>
        public static void ConfigureServiceEndpoints <T>(this IBusFactoryConfigurator <T> configurator, IBusRegistrationContext registration,
                                                         ServiceInstanceOptions options = null)
            where T : IReceiveEndpointConfigurator
        {
            options ??= new ServiceInstanceOptions();
            if (options.EndpointNameFormatter is DefaultEndpointNameFormatter)
            {
                var formatter = registration.GetService <IEndpointNameFormatter>();
                if (formatter != null)
                {
                    options.SetEndpointNameFormatter(formatter);
                }
            }

            configurator.ServiceInstance(options, instanceConfigurator =>
            {
                if (options.TryGetOptions(out JobServiceOptions jobServiceOptions))
                {
                    instanceConfigurator.ConfigureJobServiceEndpoints(jobServiceOptions);
                }

                registration.ConfigureEndpoints(instanceConfigurator, instanceConfigurator.EndpointNameFormatter);
            });
Exemplo n.º 22
0
            async Task <IBusControl> CreateInstance()
            {
                var bus = MassTransit.Bus.Factory.CreateUsingRabbitMq(cfg =>
                {
                    cfg.Host(HostAddress);

                    var options = new ServiceInstanceOptions()
                                  .SetEndpointNameFormatter(KebabCaseEndpointNameFormatter.Instance);

                    cfg.ServiceInstance(options, instance =>
                    {
                        var serviceEndpointName = instance.EndpointNameFormatter.Consumer <DeployPayloadConsumer>();

                        instance.ReceiveEndpoint(serviceEndpointName, x =>
                        {
                            x.Consumer <DeployPayloadConsumer>();
                        });
                    });
                });

                await bus.StartAsync();

                return(bus);
            }
Exemplo n.º 23
0
 protected Common_JobConsumer()
 {
     Options = new ServiceInstanceOptions()
               .EnableJobServiceEndpoints();
 }
Exemplo n.º 24
0
 protected Common_Conductor()
 {
     Options = new ServiceInstanceOptions();
 }
Exemplo n.º 25
0
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddControllers();

            services.AddDbContext <JobServiceSagaDbContext>(builder =>
                                                            builder.UseNpgsql(Configuration.GetConnectionString("JobService"), m =>
            {
                m.MigrationsAssembly(Assembly.GetExecutingAssembly().GetName().Name);
                m.MigrationsHistoryTable($"__{nameof(JobServiceSagaDbContext)}");
            }));

            services.AddMassTransit(x =>
            {
                x.AddDelayedMessageScheduler();

                x.AddConsumer <ConvertVideoJobConsumer>(typeof(ConvertVideoJobConsumerDefinition));

                x.AddConsumer <VideoConvertedConsumer>();

                x.AddSagaRepository <JobSaga>()
                .EntityFrameworkRepository(r =>
                {
                    r.ExistingDbContext <JobServiceSagaDbContext>();
                    r.LockStatementProvider = new PostgresLockStatementProvider();
                });
                x.AddSagaRepository <JobTypeSaga>()
                .EntityFrameworkRepository(r =>
                {
                    r.ExistingDbContext <JobServiceSagaDbContext>();
                    r.LockStatementProvider = new PostgresLockStatementProvider();
                });
                x.AddSagaRepository <JobAttemptSaga>()
                .EntityFrameworkRepository(r =>
                {
                    r.ExistingDbContext <JobServiceSagaDbContext>();
                    r.LockStatementProvider = new PostgresLockStatementProvider();
                });

                x.AddRequestClient <ConvertVideo>();

                x.SetKebabCaseEndpointNameFormatter();

                x.UsingRabbitMq((context, cfg) =>
                {
                    if (IsRunningInContainer)
                    {
                        cfg.Host("rabbitmq");
                    }

                    cfg.UseDelayedMessageScheduler();

                    var options = new ServiceInstanceOptions()
                                  .SetEndpointNameFormatter(context.GetService <IEndpointNameFormatter>() ?? KebabCaseEndpointNameFormatter.Instance);

                    cfg.ServiceInstance(options, instance =>
                    {
                        instance.ConfigureJobServiceEndpoints(js =>
                        {
                            js.SagaPartitionCount = 1;
                            js.FinalizeCompleted  = true;

                            js.ConfigureSagaRepositories(context);
                        });

                        instance.ConfigureEndpoints(context);
                    });
                });
            });
            services.AddMassTransitHostedService();

            services.AddOpenApiDocument(cfg => cfg.PostProcess = d => d.Info.Title = "Convert Video Service");
        }
Exemplo n.º 26
0
        public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
        .ConfigureLogging((hostingContext, logging) =>
        {
            logging.AddConfiguration(hostingContext.Configuration.GetSection("Logging"));
        })
        .UseSerilog()
        .ConfigureServices((hostContext, services) =>
        {
            var configuration = hostContext.Configuration;
            // "host=localhost;user id=postgres;password=Password12!;database=JobService;"
            var connectionString = configuration.GetConnectionString("JobService");
            Console.WriteLine("@Using Connection String : {0}", connectionString);

            services.AddDbContext <JobServiceSagaDbContext>(builder =>
                                                            builder.UseNpgsql(connectionString,
                                                                              m =>
            {
                m.MigrationsAssembly(Assembly.GetExecutingAssembly().GetName().Name);
                m.MigrationsHistoryTable($"__{nameof(JobServiceSagaDbContext)}");
            }));

            services.AddMassTransit(c =>
            {
                c.SetKebabCaseEndpointNameFormatter();         //@global-name-formatter

                c.AddRabbitMqMessageScheduler();

                //c.AddConsumersFromNamespaceContaining<DoItConsumer>();
                //c.AddConsumer<DoItConsumer>();
                c.AddConsumer <DoItJobConsumer>(typeof(DoItJobConsumerDefinition));

                c.AddSagaRepository <JobSaga>()
                .EntityFrameworkRepository(r =>
                {
                    r.ExistingDbContext <JobServiceSagaDbContext>();
                    r.LockStatementProvider = new PostgresLockStatementProvider();
                });
                c.AddSagaRepository <JobTypeSaga>()
                .EntityFrameworkRepository(r =>
                {
                    r.ExistingDbContext <JobServiceSagaDbContext>();
                    r.LockStatementProvider = new PostgresLockStatementProvider();
                });
                c.AddSagaRepository <JobAttemptSaga>()
                .EntityFrameworkRepository(r =>
                {
                    r.ExistingDbContext <JobServiceSagaDbContext>();
                    r.LockStatementProvider = new PostgresLockStatementProvider();
                });

                c.UsingRabbitMq((context, cfg) =>
                {
                    cfg.UseRabbitMqMessageScheduler();

                    var options = new ServiceInstanceOptions()
                                  .EnableInstanceEndpoint()
                                  // ServiceInstanceOptions 을 위해 따로 해줘야 하나. @global-name-formatter 에서 했는데..
                                  .SetEndpointNameFormatter(KebabCaseEndpointNameFormatter.Instance)
                                  // .EnableJobServiceEndpoints() <---- ????
                    ;
                    cfg.ServiceInstance(options,
                                        instance =>
                    {
                        instance.ConfigureJobServiceEndpoints(js =>
                        {
                            js.SagaPartitionCount = 1;
                            js.FinalizeCompleted  = true;
                            js.ConfigureSagaRepositories(context);
                        });

                        instance.ConfigureEndpoints(context);
                    });
                    cfg.ConfigureEndpoints(context);
                });
            });
            services.AddHostedService <Worker>();
        });
Exemplo n.º 27
0
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddControllers();

            services.AddDbContext <JobServiceSagaDbContext>(builder =>
            {
                builder.UseSqlServer(Configuration.GetConnectionString(nameof(JobServiceSagaDbContext)), options =>
                {
                    options.MigrationsAssembly(Assembly.GetExecutingAssembly().GetName().Name);
                });
            });


            //services.AddMassTransit(x =>
            //{

            //    x.AddRabbitMqMessageScheduler();

            //    x.AddConsumer<ConvertVideoJobConsumer>();
            //    // x.AddConsumer<ConvertVideoJobConsumer>(typeof(ConvertVideoJobConsumerDefinition));

            //    x.AddSagaRepository<JobSaga>()
            //        .EntityFrameworkRepository(r =>
            //        {
            //            r.ExistingDbContext<JobServiceSagaDbContext>();
            //            r.LockStatementProvider = new PostgresLockStatementProvider();
            //        });
            //    x.AddSagaRepository<JobTypeSaga>()
            //        .EntityFrameworkRepository(r =>
            //        {
            //            r.ExistingDbContext<JobServiceSagaDbContext>();
            //            r.LockStatementProvider = new PostgresLockStatementProvider();
            //        });
            //    x.AddSagaRepository<JobAttemptSaga>()
            //        .EntityFrameworkRepository(r =>
            //        {
            //            r.ExistingDbContext<JobServiceSagaDbContext>();
            //            r.LockStatementProvider = new PostgresLockStatementProvider();
            //        });

            //    x.AddServiceClient();

            //    x.AddRequestClient<IConvertVideo>();

            //    x.SetKebabCaseEndpointNameFormatter();

            //    x.UsingRabbitMq((context, cfg) =>
            //    {
            //        var rabbit = Configuration.GetSection("RabbitServer");
            //        var url = rabbit.GetValue<string>("Url");
            //        var host = rabbit.GetValue<string>("Host");
            //        var userName = rabbit.GetValue<string>("UserName");
            //        var password = rabbit.GetValue<string>("Password");
            //        if (rabbit == null || url == null || host == null || userName == null || password == null)
            //        {
            //            throw new InvalidOperationException("RabbitService configuration settings are not found in appSettings.json");
            //        }

            //        cfg.Host($"rabbitmq://{url}/{host}", configurator =>
            //        {
            //            configurator.Username(userName);
            //            configurator.Password(password);
            //        });

            //        cfg.UseRabbitMqMessageScheduler();

            //        var options = new ServiceInstanceOptions()
            //            .EnableInstanceEndpoint()
            //            .SetEndpointNameFormatter(KebabCaseEndpointNameFormatter.Instance);

            //        cfg.ServiceInstance(options, instance =>
            //        {
            //            instance.ConfigureJobServiceEndpoints(js =>
            //            {
            //                js.FinalizeCompleted = true;

            //                js.ConfigureSagaRepositories(context);
            //            });

            //            instance.ConfigureEndpoints(context);
            //        });
            //    });
            //});


            //services.AddOpenApiDocument(cfg => cfg.PostProcess = d => d.Info.Title = "Convert Video Service");

            services.AddMassTransit(x =>
            {
                x.AddRabbitMqMessageScheduler();
                x.AddConsumer <ConvertVideoJobConsumer>();
                x.AddConsumer <ConvertVideoJobConsumer>(typeof(ConvertVideoJobConsumerDefinition));

                x.AddSagaRepository <JobSaga>()
                .EntityFrameworkRepository(r =>
                {
                    r.ExistingDbContext <JobServiceSagaDbContext>();
                    r.LockStatementProvider = new SqlServerLockStatementProvider();
                });
                x.AddSagaRepository <JobTypeSaga>()
                .EntityFrameworkRepository(r =>
                {
                    r.ExistingDbContext <JobServiceSagaDbContext>();
                    r.LockStatementProvider = new SqlServerLockStatementProvider();
                });
                x.AddSagaRepository <JobAttemptSaga>()
                .EntityFrameworkRepository(r =>
                {
                    r.ExistingDbContext <JobServiceSagaDbContext>();
                    r.LockStatementProvider = new SqlServerLockStatementProvider();
                });

                x.AddServiceClient();

                x.AddRequestClient <IConvertVideo>();

                x.SetKebabCaseEndpointNameFormatter();


                x.UsingRabbitMq((context, cfg) =>
                {
                    cfg.UseRabbitMqMessageScheduler();

                    var options = new ServiceInstanceOptions()
                                  .EnableInstanceEndpoint()
                                  .SetEndpointNameFormatter(KebabCaseEndpointNameFormatter.Instance);

                    cfg.ServiceInstance(options, instance =>
                    {
                        var rabbit   = Configuration.GetSection("RabbitServer");
                        var url      = rabbit.GetValue <string>("Url");
                        var host     = rabbit.GetValue <string>("Host");
                        var userName = rabbit.GetValue <string>("UserName");
                        var password = rabbit.GetValue <string>("Password");
                        if (rabbit == null || url == null || host == null || userName == null || password == null)
                        {
                            throw new InvalidOperationException("RabbitService configuration settings are not found in appSettings.json");
                        }

                        cfg.Host($"rabbitmq://{url}/{host}", configurator =>
                        {
                            configurator.Username(userName);
                            configurator.Password(password);
                        });

                        instance.ConfigureJobServiceEndpoints(js =>
                        {
                            js.FinalizeCompleted = true;

                            js.ConfigureSagaRepositories(context);
                        });

                        instance.ConfigureEndpoints(context);
                    });
                });
            });


            services.AddMassTransitHostedService();
        }
Exemplo n.º 28
0
        /// <summary>
        /// Configure service endpoints for all defined consumer, saga, and activity types using an optional
        /// endpoint name formatter. If no endpoint name formatter is specified, and an <see cref="IEndpointNameFormatter"/>
        /// is registered in the container, it is resolved from the container. Otherwise, the <see cref="DefaultEndpointNameFormatter"/>
        /// is used.
        /// </summary>
        /// <param name="configurator">The <see cref="IBusFactoryConfigurator"/> for the bus being configured</param>
        /// <param name="registration">The container registration</param>
        /// <param name="options">The service instance options</param>
        /// <typeparam name="TEndpointConfigurator">The ReceiveEndpointConfigurator type for the transport</typeparam>
        public static void ConfigureServiceEndpoints <TEndpointConfigurator>(this IReceiveConfigurator <TEndpointConfigurator> configurator,
                                                                             IRegistrationContext <IComponentContext> registration, ServiceInstanceOptions options = null)
            where TEndpointConfigurator : IReceiveEndpointConfigurator
        {
            options ??= new ServiceInstanceOptions();
            if (options.EndpointNameFormatter is DefaultEndpointNameFormatter && registration.Container.TryResolve <IEndpointNameFormatter>(out var formatter))
            {
                options.SetEndpointNameFormatter(formatter);
            }

            configurator.ServiceInstance(options, instanceConfigurator =>
            {
                registration.ConfigureEndpoints(instanceConfigurator, instanceConfigurator.EndpointNameFormatter);
            });
        }
        /// <summary>
        /// Configure service endpoints for all defined consumer, saga, and activity types using an optional
        /// endpoint name formatter. If no endpoint name formatter is specified, and an <see cref="IEndpointNameFormatter"/>
        /// is registered in the container, it is resolved from the container. Otherwise, the <see cref="DefaultEndpointNameFormatter"/>
        /// is used.
        /// </summary>
        /// <param name="configurator">The <see cref="IBusFactoryConfigurator"/> for the bus being configured</param>
        /// <param name="context">The container reference</param>
        /// <param name="options">The service instance options</param>
        /// <typeparam name="TEndpointConfigurator">The ReceiveEndpointConfigurator type for the transport</typeparam>
        public static void ConfigureServiceEndpoints <TEndpointConfigurator>(this IReceiveConfigurator <TEndpointConfigurator> configurator,
                                                                             IServiceContext context, ServiceInstanceOptions options = null)
            where TEndpointConfigurator : IReceiveEndpointConfigurator
        {
            var registration = context.GetInstance <IRegistration>();

            options ??= new ServiceInstanceOptions();
            if (options.EndpointNameFormatter is DefaultEndpointNameFormatter)
            {
                var formatter = context.TryGetInstance <IEndpointNameFormatter>();
                if (formatter != null)
                {
                    options.SetEndpointNameFormatter(formatter);
                }
            }

            configurator.ServiceInstance(options, instanceConfigurator =>
            {
                registration.ConfigureEndpoints(instanceConfigurator, instanceConfigurator.EndpointNameFormatter);
            });
        }
        /// <summary>
        /// Configure service endpoints for all defined consumer, saga, and activity types using an optional
        /// endpoint name formatter. If no endpoint name formatter is specified, and an <see cref="IEndpointNameFormatter"/>
        /// is registered in the container, it is resolved from the container. Otherwise, the <see cref="DefaultEndpointNameFormatter"/>
        /// is used.
        /// </summary>
        /// <param name="configurator">The <see cref="IBusFactoryConfigurator"/> for the bus being configured</param>
        /// <param name="container">The container reference</param>
        /// <param name="options">The service instance options</param>
        /// <typeparam name="TEndpointConfigurator">The ReceiveEndpointConfigurator type for the transport</typeparam>
        public static void ConfigureServiceEndpoints <TEndpointConfigurator>(this IReceiveConfigurator <TEndpointConfigurator> configurator,
                                                                             IWindsorContainer container, ServiceInstanceOptions options = null)
            where TEndpointConfigurator : IReceiveEndpointConfigurator
        {
            var registration = container.Resolve <IRegistration>();

            options ??= new ServiceInstanceOptions();
            if (options.EndpointNameFormatter is DefaultEndpointNameFormatter && container.Kernel.HasComponent(typeof(IEndpointNameFormatter)))
            {
                options.SetEndpointNameFormatter(container.Kernel.Resolve <IEndpointNameFormatter>());
            }

            configurator.ServiceInstance(options, instanceConfigurator =>
            {
                registration.ConfigureEndpoints(instanceConfigurator, instanceConfigurator.EndpointNameFormatter);
            });
        }