public static void AddCustomMassTransit(this IServiceCollection services, IConfiguration configuration)
        {
            var options = new MassTransitOptions();

            configuration.GetSection("RabbitMq").Bind(options);
            services.AddMassTransit(appProvider =>
            {
                return(Bus.Factory.CreateUsingRabbitMq(
                           configurator =>
                {
                    var host = configurator.Host(new Uri($"{options.Host}:{options.Port}"), h =>
                    {
                        h.Username(options.Username);
                        h.Password(options.Password);
                    });

                    configurator.ReceiveEndpoint(host, "user_updated_events", ep =>
                    {
                        ep.Handler <UserUpdatedEvent>(async context =>
                        {
                            await services.BuildServiceProvider()
                            .GetRequiredService <IEventHandler <UserUpdatedEvent> >().Handle(context.Message);
                        });
                    });
                }));
            });
        }
Esempio n. 2
0
        public static IServiceCollection AddNybusLegacyWithMassTransit(this IServiceCollection services, NybusLegacyConfiguration configuration)
        {
            services.AddNybusLegacy(configuration.NybusConfigurator, configuration.SubscriptionsConfigurator);

            services.AddSingleton(sp =>
            {
                var options = new MassTransitOptions();

                configuration.MassTransitConfigurator?.Invoke(options);

                return(options);
            });

            services.AddSingleton(sp =>
            {
                var cfg = sp.GetRequiredService <IConfiguration>();
                var connectionString = cfg.GetConnectionString(configuration.ConnectionStringName);

                return(MassTransitConnectionDescriptor.Parse(connectionString));
            });

            services.AddSingleton <IBusEngine>(sp =>
            {
                var descriptor = sp.GetRequiredService <MassTransitConnectionDescriptor>();

                var options = sp.GetRequiredService <MassTransitOptions>();

                return(new MassTransitBusEngine(descriptor, options));
            });

            return(services);
        }
        public IBusControl CreateServiceBus(MassTransitOptions options, IReadOnlyList <Action <IReceiveEndpointConfigurator> > commandSubscriptions, IReadOnlyList <Action <IReceiveEndpointConfigurator> > eventSubscriptions)
        {
            return(Bus.Factory.CreateUsingInMemory(cfg =>
            {
                cfg.UseJsonSerializer();
                cfg.UseConcurrencyLimit(options.ConcurrencyLimit);

                if (commandSubscriptions.Any())
                {
                    cfg.ReceiveEndpoint(options.CommandQueueNameStrategy.GetQueueName(), endpoint =>
                    {
                        endpoint.UseRetry(options.CommandErrorPolicy);

                        foreach (var subscription in commandSubscriptions)
                        {
                            subscription(endpoint);
                        }
                    });
                }

                if (eventSubscriptions.Any())
                {
                    cfg.ReceiveEndpoint(options.EventQueueNameStrategy.GetQueueName(), endpoint =>
                    {
                        endpoint.UseRetry(options.EventErrorPolicy);

                        foreach (var subscription in eventSubscriptions)
                        {
                            subscription(endpoint);
                        }
                    });
                }
            }));
        }
Esempio n. 4
0
        public static void AddMassTransit(this IServiceCollection serviceCollection, Action <MassTransitOptions> opt = null)
        {
            var options = new MassTransitOptions(serviceCollection);

            serviceCollection.AddSingleton(options);

            if (opt == null)
            {
                opt(options);
            }
        }
        public void Initialize()
        {
            fixture = new Fixture();

            commandQueueName = fixture.Create <string>();
            eventQueueName   = fixture.Create <string>();

            mockLoggerFactory = new Mock <ILoggerFactory>();
            mockLogger        = new Mock <ILogger>();

            mockLoggerFactory.Setup(p => p.CreateLogger(It.IsAny <string>())).Returns(() => mockLogger.Object);

            mockContextManager = new Mock <IContextManager>();

            mockCommandErrorStrategy = new Mock <IErrorStrategy>();
            mockCommandQueueStrategy = new Mock <IQueueStrategy>();
            mockCommandServiceBus    = new Mock <IServiceBus>();

            mockEventErrorStrategy = new Mock <IErrorStrategy>();
            mockEventQueueStrategy = new Mock <IQueueStrategy>();
            mockEventServiceBus    = new Mock <IServiceBus>();

            mockServiceBusFactory = new Mock <IServiceBusFactory>();
            mockServiceBusFactory.Setup(p => p.CreateServiceBus(It.IsAny <MassTransitConnectionDescriptor>(), mockCommandQueueStrategy.Object, It.IsAny <IReadOnlyList <Action <SubscriptionBusServiceConfigurator> > >())).Returns(mockCommandServiceBus.Object);
            mockServiceBusFactory.Setup(p => p.CreateServiceBus(It.IsAny <MassTransitConnectionDescriptor>(), mockEventQueueStrategy.Object, It.IsAny <IReadOnlyList <Action <SubscriptionBusServiceConfigurator> > >())).Returns(mockEventServiceBus.Object);

            mockCommandQueueStrategy.Setup(p => p.GetQueueName()).Returns(commandQueueName);
            mockEventQueueStrategy.Setup(p => p.GetQueueName()).Returns(eventQueueName);

            options = new MassTransitOptions
            {
                LoggerFactory        = mockLoggerFactory.Object,
                CommandErrorStrategy = mockCommandErrorStrategy.Object,
                CommandQueueStrategy = mockCommandQueueStrategy.Object,
                EventErrorStrategy   = mockEventErrorStrategy.Object,
                EventQueueStrategy   = mockEventQueueStrategy.Object,
                ServiceBusFactory    = mockServiceBusFactory.Object,
                ContextManager       = mockContextManager.Object
            };

            var host     = fixture.Create <Uri>();
            var userName = fixture.Create <string>();
            var password = fixture.Create <string>();

            connectionDescriptor = new MassTransitConnectionDescriptor(host, userName, password);
        }
        public IBusControl CreateServiceBus(MassTransitOptions options, IReadOnlyList <Action <IReceiveEndpointConfigurator> > commandSubscriptions, IReadOnlyList <Action <IReceiveEndpointConfigurator> > eventSubscriptions)
        {
            var bus = Bus.Factory.CreateUsingRabbitMq(cfg =>
            {
                var host = cfg.Host(_connectionDescriptor.Host, h =>
                {
                    h.Username(_connectionDescriptor.UserName);
                    h.Password(_connectionDescriptor.Password);
                });

                cfg.UseJsonSerializer();
                cfg.UseConcurrencyLimit(options.ConcurrencyLimit);

                if (commandSubscriptions.Any())
                {
                    cfg.ReceiveEndpoint(host, options.CommandQueueNameStrategy.GetQueueName(), endpoint =>
                    {
                        endpoint.UseRetry(options.CommandErrorPolicy);
                        _rabbitMqOptions.CommandQueuePolicy.ApplyPolicy(endpoint);

                        foreach (var subscription in commandSubscriptions)
                        {
                            subscription(endpoint);
                        }
                    });
                }

                if (eventSubscriptions.Any())
                {
                    cfg.ReceiveEndpoint(host, options.EventQueueNameStrategy.GetQueueName(), endpoint =>
                    {
                        endpoint.UseRetry(options.EventErrorPolicy);
                        _rabbitMqOptions.EventQueuePolicy.ApplyPolicy(endpoint);

                        foreach (var subscription in eventSubscriptions)
                        {
                            subscription(endpoint);
                        }
                    });
                }
            });

            return(bus);
        }
        public MassTransitOption SelectedMassTransitOption()
        {
            if (MassTransitOptions == null)
            {
                throw new ArgumentNullException(nameof(MassTransitOptions));
            }

            if (!MassTransitOptions.Any())
            {
                throw new ArgumentException($"{nameof(MassTransitOptions)} is empty");
            }

            MassTransitOption massTransitOption = MassTransitOptions.FirstOrDefault(o => o.Index == SelectedIndex);

            if (massTransitOption == null)
            {
                throw new ArgumentOutOfRangeException($"MassTransitOption could not found. {nameof(SelectedIndex)} : {SelectedIndex}");
            }

            return(massTransitOption);
        }
Esempio n. 8
0
        public void MasstransitConfig(IRabbitMqBusFactoryConfigurator configurator, IContainer container, ILogger logger, IJimuBus bus, MassTransitOptions options)
        {
            //-- command consumer, extract queue name from command
            var groupConsumers = _consumers.GroupBy(x =>
            {
                var commandType     = x.GetTypeInfo().ImplementedInterfaces.First().GenericTypeArguments.First();
                var commandInstance = container.Resolve(commandType);
                if (commandInstance == null)
                {
                    throw new Exception($"JimuCommand: {commandType.FullName} resolve failure");
                }
                var commandQueueName = commandInstance.GetType().InvokeMember("QueueName", BindingFlags.GetProperty, null, commandInstance, null) + "";
                if (string.IsNullOrWhiteSpace(commandQueueName))
                {
                    throw new Exception($"JimuCommand: {commandType.FullName} must specify QueueName property");
                }
                return(commandQueueName);
            });

            groupConsumers.ToList().ForEach(x =>
            {
                configurator.ReceiveEndpoint(x.Key, ep =>
                {
                    logger.Debug($"MassTransitRabbitMq: CommandQueueName: { x.Key}, consumers count: {x.Count()}");
                    x.ToList().ForEach(consumer =>
                    {
                        var commandType      = consumer.GetTypeInfo().ImplementedInterfaces.First().GenericTypeArguments.First();
                        var handlerMethod    = typeof(HandlerExtensions).GetMethod("Handler").MakeGenericMethod(commandType);
                        var consumerInstance = container.Resolve(consumer);
                        var myHandlerObj     = Activator.CreateInstance(typeof(CommandHandler <>).MakeGenericType(commandType), new object[] { consumerInstance, bus });
                        var consumerHandler  = myHandlerObj.GetType().InvokeMember("Handler", BindingFlags.GetProperty, null, myHandlerObj, null);
                        var fastInvoker      = FastInvoke.GetMethodInvoker(handlerMethod);
                        fastInvoker.Invoke(null, new object[] { ep, consumerHandler, null });
                    });
                });
            });
        }
Esempio n. 9
0
 public UserService(IBus bus, MassTransitOptions options) : base(bus, options)
 {
 }
Esempio n. 10
0
        public void MasstransitConfig(IRabbitMqBusFactoryConfigurator configurator, IContainer container, ILogger logger, IJimuBus bus, MassTransitOptions _options)
        {
            if (_subscribers.Any())
            {
                //-- event subscriber, generate default event queue, if not specify in options

                var eventQueueName = string.IsNullOrEmpty(_options.EventQueueName) ? $"{AppDomain.CurrentDomain.FriendlyName}-{Guid.NewGuid()}" : _options.EventQueueName;

                configurator.ReceiveEndpoint(eventQueueName, ep =>
                {
                    _subscribers.ForEach(subscriber =>
                    {
                        var subscriberType     = subscriber.GetTypeInfo().ImplementedInterfaces.First().GenericTypeArguments.First();
                        var handlerMethod      = typeof(HandlerExtensions).GetMethod("Handler").MakeGenericMethod(subscriberType);
                        var subscriberInstance = container.Resolve(subscriber);
                        var myHandlerObj       = Activator.CreateInstance(typeof(EventHandler <>).MakeGenericType(subscriberType), new object[] { subscriberInstance, bus });
                        var eventHandler       = myHandlerObj.GetType().InvokeMember("Handler", BindingFlags.GetProperty, null, myHandlerObj, null);
                        var fastInvoker        = FastInvoke.GetMethodInvoker(handlerMethod);
                        fastInvoker.Invoke(null, new object[] { ep, eventHandler, null });
                    });
                });
                logger.Debug($"MassTransitRabbitMq: EventQueueName: { eventQueueName}, subscribers count: {_subscribers.Count()}");
            }
        }
Esempio n. 11
0
 public MassTransitServerModule(IConfigurationRoot jimuAppSettings) : base(jimuAppSettings)
 {
     _options = jimuAppSettings.GetSection(typeof(MassTransitOptions).Name).Get <MassTransitOptions>();
 }
        /// <summary>
        /// Add the services for MassTransit according to the Threax convention. This will setup a connection to a single queue using MassTransit over RabbitMQ.
        /// </summary>
        /// <param name="services">The service collection to modify.</param>
        /// <param name="configure">The configure callback function.</param>
        /// <returns>The passed in ServiceCollection.</returns>
        public static IServiceCollection AddThreaxMassTransit(this IServiceCollection services, Action <MassTransitOptions> configure = null)
        {
            var options = new MassTransitOptions();

            configure?.Invoke(options);

            services.AddMassTransit(o =>
            {
                var args                    = new Object[0];
                var addConsumer             = o.GetType().GetMethod(nameof(IServiceCollectionConfigurator.AddConsumer));
                IEnumerable <Type> allTypes = new Type[0];
                foreach (var assembly in options.AutoLoadAssemblies)
                {
                    if (assembly != null)
                    {
                        allTypes = allTypes.Concat(assembly.ExportedTypes);
                    }
                }
                foreach (var consumer in options.Consumers)
                {
                    var addConsumerGeneric = addConsumer.MakeGenericMethod(consumer.Type);
                    addConsumerGeneric.Invoke(o, args);
                    switch (consumer.Lifetime)
                    {
                    case Lifetime.Scoped:
                        services.AddScoped(consumer.Type);
                        break;

                    case Lifetime.Singleton:
                        services.AddSingleton(consumer.Type);
                        break;

                    case Lifetime.Transient:
                        services.AddTransient(consumer.Type);
                        break;
                    }
                }

                foreach (var consumerType in allTypes.Where(i => typeof(IConsumer).IsAssignableFrom(i) && !i.GetCustomAttributes(typeof(NoAutoDiscoverMessages), false).Any()))
                {
                    if (!options.Consumers.Any(i => i.Type == consumerType))
                    {
                        var addConsumerGeneric = addConsumer.MakeGenericMethod(consumerType);
                        addConsumerGeneric.Invoke(o, args);
                        services.AddScoped(consumerType);
                    }
                }

                var addSaga = o.GetType().GetMethod(nameof(IServiceCollectionConfigurator.AddSaga));
                foreach (var saga in options.Sagas)
                {
                    var addSagaGeneric = addSaga.MakeGenericMethod(saga.Type);
                    addSagaGeneric.Invoke(o, args);
                    switch (saga.Lifetime)
                    {
                    case Lifetime.Scoped:
                        services.AddScoped(saga.Type);
                        break;

                    case Lifetime.Singleton:
                        services.AddSingleton(saga.Type);
                        break;

                    case Lifetime.Transient:
                        services.AddTransient(saga.Type);
                        break;
                    }
                }

                foreach (var sagaType in allTypes.Where(i => typeof(ISaga).IsAssignableFrom(i) && !i.GetCustomAttributes(typeof(NoAutoDiscoverMessages), false).Any()))
                {
                    if (!options.Consumers.Any(i => i.Type == sagaType))
                    {
                        var addSagaGeneric = addSaga.MakeGenericMethod(sagaType);
                        addSagaGeneric.Invoke(o, args);
                        services.AddScoped(sagaType);
                    }
                }
            });

            if (options.Host == "InMemory")
            {
                services.AddSingleton <IBusControl>(s => Bus.Factory.CreateUsingInMemory(o =>
                {
                    if (options.OpenQueue)
                    {
                        o.ReceiveEndpoint(options.QueueName, e =>
                        {
                            e.LoadFrom(serviceProvider);
                        });
                    }
                }));
            }
            else
            {
                services.AddSingleton <IBusControl>(s => Bus.Factory.CreateUsingRabbitMq(sbc =>
                {
                    var uriBuilder = new UriBuilder(options.Host);

                    if (options.UseSsl)
                    {
                        uriBuilder.Port = options.SslPort;
                    }

                    var host = sbc.Host(uriBuilder.Uri, h =>
                    {
                        h.Username(options.Username);
                        h.Password(options.Password);

                        if (options.UseSsl)
                        {
                            h.UseSsl(o =>
                            {
                                o.UseCertificateAsAuthenticationIdentity = false;
                                o.ServerName = uriBuilder.Host;
                                o.Protocol   = System.Security.Authentication.SslProtocols.Tls12;
                                options.ConfigureSsl?.Invoke(o);
                            });
                        }
                    });

                    if (options.OpenQueue)
                    {
                        sbc.ReceiveEndpoint(host, options.QueueName, e =>
                        {
                            e.LoadFrom(serviceProvider);
                        });
                    }
                }));
            }
            services.AddSingleton <IPublishEndpoint>(s => s.GetRequiredService <IBusControl>());
            services.AddTransient(typeof(IEventQueue <>), typeof(MassTransitEventQueue <>));

            return(services);
        }
Esempio n. 13
0
        public void MasstransitConfig(IRabbitMqBusFactoryConfigurator configurator, IContainer container, ILogger logger, IJimuBus bus, MassTransitOptions options)
        {
            //-- request handler, extract queue name from request
            var groupHandlers = _requestHandlers.GroupBy(x =>
            {
                var requestType     = x.GetTypeInfo().ImplementedInterfaces.First().GenericTypeArguments.First();
                var requestInstance = container.Resolve(requestType);
                if (requestInstance == null)
                {
                    throw new Exception($"JimuRequest: {requestType.FullName} resolve failure");
                }
                var requestQueueName = requestInstance.GetType().InvokeMember("QueueName", BindingFlags.GetProperty, null, requestInstance, null) + "";
                if (string.IsNullOrWhiteSpace(requestQueueName))
                {
                    throw new Exception($"JimuRequest: {requestType.FullName} must specify QueueName property");
                }
                return(requestQueueName);
            });


            groupHandlers.ToList().ForEach(x =>
            {
                configurator.ReceiveEndpoint(x.Key, ep =>
                {
                    logger.Debug($"MassTransitRabbitMq: RequestQueueName: { x.Key}, handler count: {x.Count()}");
                    x.ToList().ForEach(handler =>
                    {
                        var requestType     = handler.GetTypeInfo().ImplementedInterfaces.First().GenericTypeArguments.First();
                        var respType        = handler.GetTypeInfo().ImplementedInterfaces.First().GenericTypeArguments[1];
                        var handlerMethod   = typeof(HandlerExtensions).GetMethod("Handler").MakeGenericMethod(requestType);
                        var requestInstance = container.Resolve(handler);
                        var myHandlerObj    = Activator.CreateInstance(typeof(RequestHandler <,>).MakeGenericType(requestType, respType), new object[] { requestInstance, bus });
                        var requestHandler  = myHandlerObj.GetType().InvokeMember("Handler", BindingFlags.GetProperty, null, myHandlerObj, null);
                        var fastInvoker     = FastInvoke.GetMethodInvoker(handlerMethod);
                        try
                        {
                            fastInvoker.Invoke(null, new object[] { ep, requestHandler, null });
                        }
                        catch (Exception ex)
                        {
                            logger.Error($"error occure when handling RabbitMq request: {x.Key}", ex);
                        }
                    });
                });
            });
        }
Esempio n. 14
0
 protected BaseSender(IBus bus, MassTransitOptions options)
 {
     Bus = bus;
     MassTransitOptions = options;
 }