示例#1
0
        public void SetUp()
        {
            _subscriptionManager          = Substitute.For <ISubscriptionManager>();
            _rabbitMqPersistentConnection = Substitute.For <IRabbitMqPersistentConnection>();
            _rabbitConsumerInitializer    = Substitute.For <IRabbitConsumerInitializer>();
            var rabbitMqEventBusOptions = Substitute.For <IOptions <RabbitMqEventBusOptions> >();
            var value = Substitute.For <RabbitMqEventBusOptions>();

            rabbitMqEventBusOptions.Value.Returns(value);
            _rabbitMqEventBusOptionsValue = value;
            var queueName    = Guid.NewGuid().ToString();
            var exchangeName = Guid.NewGuid().ToString();

            value.QueueName.Returns(queueName);
            value.ExchangeName.Returns(exchangeName);
            _model = Substitute.For <IModel>();
            _rabbitMqPersistentConnection.CreateModel().Returns(_model);
            _subscription = new Subscription <Event>();
            _subscriptionManager.AddSubscription <Event>().Returns(_subscription);


            _sut = new RabbitMqEventSubscriber(_subscriptionManager, _rabbitMqPersistentConnection, _rabbitConsumerInitializer, rabbitMqEventBusOptions, Substitute.For <ILogger <RabbitMqEventSubscriber> >());

            _rabbitConsumerInitializer.Received(1).InitializeConsumersChannelsAsync();
        }
示例#2
0
        /// <summary>
        /// 初始化一个<see cref="RabbitMqEventBus"/>类型的实例
        /// </summary>
        /// <param name="messageEventBus">消息事件总线</param>
        /// <param name="options">RabbitMq 事件总线配置</param>
        public RabbitMqEventBus(/*IMessageEventBus messageEventBus,*/ RabbitMqEventBusOptions options)
        {
            _channel = options.Channel;
            _options = options;

            //_options.MessagePublisher = messageEventBus;
        }
        public static EventBusOptionsBuilder UseRabbitMQ(
            [NotNull] this EventBusOptionsBuilder optionsBuilder,
            [NotNull] Action <RabbitMqEventBusOptions> optionsAction)
        {
            Check.NotNull(optionsBuilder, nameof(optionsBuilder));
            Check.NotNull(optionsAction, nameof(optionsAction));

            optionsBuilder.Fx.Services.Configure(optionsAction);

            var options = new RabbitMqEventBusOptions();

            optionsAction?.Invoke(options);
            optionsBuilder.Fx.AddRabbitMq(x =>
            {
                x.Host     = options.Host;
                x.UserName = options.UserName;
                x.Password = options.Password;
            });
            optionsBuilder.Fx.Services.AddSingleton <IEventBus, RabbitMqDistributedEventBus>();
            return(optionsBuilder);
        }
示例#4
0
        public void SetUp()
        {
            _rabbitMqPersistentConnection = Substitute.For <IRabbitMqPersistentConnection>();
            _rabbitConsumerHandler        = Substitute.For <IRabbitConsumerHandler>();
            var rabbitMqEventBusOptions = Substitute.For <IOptions <RabbitMqEventBusOptions> >();
            var value = Substitute.For <RabbitMqEventBusOptions>();

            rabbitMqEventBusOptions.Value.Returns(value);
            _rabbitMqEventBusOptions = value;
            var queueName    = Guid.NewGuid().ToString();
            var exchangeName = Guid.NewGuid().ToString();

            value.QueueName.Returns(queueName);
            value.ExchangeName.Returns(exchangeName);
            _model = Substitute.For <IModel>();
            _rabbitMqPersistentConnection.CreateModel().Returns(_model);
            _consumer = Substitute.For <EventingBasicConsumer>(Substitute.For <IModel>());
            _rabbitMqPersistentConnection.CreateConsumer(_model).Returns(_consumer);

            _sut = new RabbitConsumerInitializer(_rabbitMqPersistentConnection, rabbitMqEventBusOptions, _rabbitConsumerHandler, Substitute.For <ILogger <RabbitConsumerInitializer> >());
        }
示例#5
0
        /// <summary>
        /// 注册 RabbitMQ
        /// </summary>
        /// <param name="services">服务</param>
        /// <param name="optionAction">RabbitMQ 配置</param>
        public static void AddRabbitMq(this ContainerBuilder services, Action <RabbitMqOptions> optionAction)
        {
            var option = new RabbitMqEventBusOptions();

            optionAction(option);

            var factory = new ConnectionFactory()
            {
                HostName = option.HostName,
                UserName = option.UserName,
                Password = option.Password
            };

            // 创建连接
            var connection = factory.CreateConnection();
            // 创建通道
            var channel = connection.CreateModel();

            // 声明一个队列(durable=true 持久化消息)
            channel.QueueDeclare(option.QueueName, true, false, false, null);

            if (!string.IsNullOrWhiteSpace(option.ExchangeName))
            {
                channel.ExchangeDeclare(option.ExchangeName, option.ExchangeType, false, false, null);

                // 将队列绑定到交换机
                channel.QueueBind(option.QueueName, option.ExchangeName, option.RouteKey, null);
            }

            option.Channel = channel;

            // 事件基本消费者
            EventingBasicConsumer consumer = new EventingBasicConsumer(channel);

            // 接收到消息事件
            consumer.Received += (sender, args) =>
            {
                var     json        = Encoding.UTF8.GetString(args.Body);
                var     o           = JObject.Parse(json);
                var     messageType = Type.GetType(o[nameof(MessageEvent.MessageType)].Value <string>());
                dynamic message     = o.ToObject(messageType);

                try
                {
                    var handlers = Ioc.CreateList(typeof(IEventHandler <>).MakeGenericType(messageType));

                    foreach (var handler in handlers)
                    {
                        ((dynamic)handler).Handle((dynamic)message);
                    }

                    // 确认该消息已被消费
                    channel.BasicAck(args.DeliveryTag, false);
                }
                catch
                {
                    // ignored
                }
            };

            // 启动消费者 设置为手动应答消息
            channel.BasicConsume(option.QueueName, false, consumer);

            services.AddSingleton(option);
        }