/// <summary> /// 需要消费Event /// </summary> /// <param name="host">服务器ip</param> /// <param name="queue">Queue名称</param> /// <param name="concurrentConsumers">消费者数量</param> /// <param name="configurator">消费者的配置对象</param> public void SubscribeAt(string host, string queue, int concurrentConsumers, IConsumeConfigurator configurator) { var endpoint = string.Format("rabbitmq://{0}/{1}", host, queue); var rabbitEndpoint = new[] { host }; var consumers = GetQueueConsumers(queue); var bus = ServiceBusFactory.New(sbc => { sbc.ReceiveFrom(endpoint); sbc.UseRabbitMq( x => { x.UseRoundRobinConnectionPolicy(rabbitEndpoint); x.PersistMessages(true); } ); sbc.SetConcurrentConsumerLimit(concurrentConsumers); sbc.Subscribe(x => configurator.Configure(x, consumers)); }); //var publisher = new EventPublisher(bus); //_reg.Inject<IEventPublisher>(publisher); // 记录消费者服务总线对象 var consumerBus = new EventConsumerBus(bus); _reg.Inject <IEventConsumerBus>(consumerBus); }
public void SubscribeAt() { if (_logger.IsEnabled(LogLevel.Information)) { _logger.LogInformation("开启订阅..."); } _consumeConfigurator.Configure(GetQueueConsumers()); }
/// <summary> /// 消费方注册 /// </summary> /// <param name="host"></param> /// <param name="configurator"></param> public void SubscribeAt(string host, IConsumeConfigurator configurator, ushort threadCount = 0) { var url = string.Format("rabbitmq://{0}", host); var allEvents = _reg.GetAllInstance <IEvent>().ToList(); var busControl = Bus.Factory.CreateUsingRabbitMq(cfg => { cfg.Host(new Uri(url), h => { h.Username(rabbitMQConfig.Username); h.Password(rabbitMQConfig.Password); }); //cfg.UseConcurrencyLimit(2); foreach (var eventType in allEvents) { var @event = eventType as Event; cfg.ReceiveEndpoint(@event.QueueName, x => { if (!string.IsNullOrEmpty(@event.ExchangeName)) { x.ConfigureConsumeTopology = false; x.Bind(@event.ExchangeName, a => { a.RoutingKey = @event.RoutingKey; a.ExchangeType = @event.ExchangeType; a.Durable = true; }); } x.UseMessageRetry(r => { //按照2,4,8,16进行4次重试,单位秒 r.Exponential(ConstField.RetryCount, TimeSpan.FromSeconds(1), TimeSpan.FromSeconds(16), TimeSpan.FromSeconds(2)); r.Handle <RequeueException>(); }); //异常记录 x.UseExceptionLogger(); //启动的线程数量,不设置的时候一般默认为cpu核数的两倍 //PrefetchCount:unack的数量 //UseConcurrencyLimit 线程的数量 if (threadCount > 0) { x.PrefetchCount = threadCount; cfg.UseConcurrencyLimit(threadCount); } var consumers = GetQueueConsumers(eventType.GetType()); configurator.Configure(x, cfg, consumers); }); } }); busControl.Start(); }
private IBusControl ConfigureBus(ConsistentHashNode phost, IConsumeConfigurator configurator = null) { var endpoint = string.Format("rabbitmq://{0}/", phost.Host); return(Bus.Factory.CreateUsingRabbitMq(cfg => { var host = cfg.Host(new Uri(endpoint), h => { h.Username(phost.UserName); h.Password(phost.Password); }); cfg.Durable = true; cfg.UseRateLimit(int.Parse(phost.UseRateLimit), TimeSpan.FromSeconds(1)); //每分钟消息消费数限定在1000之内 cfg.UseConcurrencyLimit(int.Parse(phost.CunsumerNum)); cfg.UseRetry(Retry.Interval(int.Parse(phost.UseRetryNum), TimeSpan.FromMinutes(1))); //消息消费失败后重试3次,每次间隔1分钟 if (configurator != null) { var consumers = GetQueueConsumers(phost.QueueName); cfg.ReceiveEndpoint(host, phost.QueueName, eq => configurator.Configure(eq, consumers)); } })); }
public void SubscribeAt() { _consumeConfigurator.Configure(GetQueueConsumers()); }