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(); }
/// <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); }
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> >()); }
/// <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); }