/// <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); }
/// <summary> /// 需要消费Event /// </summary> /// <param name="host">队列配置对象</param> /// <param name="configurator"></param> public void SubscribeAt(SubscribeHost host, IConsumeConfigurator configurator) { if (host == null) { throw new ArgumentNullException("host"); } SubscribeAt(host.Host, host.QueueName, host.CunsumerNum, configurator); }
/// <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(); }
/// <summary> /// 发送方注册 /// </summary> /// <param name="host"></param> /// <param name="queue"></param> public void PublishAt(string host, IConsumeConfigurator configurator) { var url = string.Format("rabbitmq://{0}", host); var busControl = Bus.Factory.CreateUsingRabbitMq(cfg => { cfg.Host(new Uri(url), h => { h.Username(rabbitMQConfig.Username); h.Password(rabbitMQConfig.Password); }); configurator.ConfigurePublisher(cfg); }); busControl.Start(); var virtualName = host.Split('/').Last(); if (!SubscriptionAdapt.PublishBusControl.ContainsKey(virtualName)) { SubscriptionAdapt.PublishBusControl.Add(virtualName, busControl); } }
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 RabbitMqSubscriptionAdapt(IEnumerable <IEventHandler> handlers, IConsumeConfigurator consumeConfigurator) { _handlers = handlers; _consumeConfigurator = consumeConfigurator; }
/// <summary> /// Initializes a new instance of the <see cref="KafkaSubscriptionAdapt" /> class. /// </summary> /// <param name="consumeConfigurator">The consume configurator.</param> /// <param name="integrationEventHandler">The integration event handler.</param> public KafkaSubscriptionAdapt(IConsumeConfigurator consumeConfigurator, IEnumerable <IIntegrationEventHandler> integrationEventHandler) { _consumeConfigurator = consumeConfigurator; _integrationEventHandler = integrationEventHandler; }
public RabbitMqSubscriptionAdapt(IConsumeConfigurator consumeConfigurator, IEnumerable <IIntegrationEventHandler> integrationEventHandler) { this._consumeConfigurator = consumeConfigurator; this._integrationEventHandler = integrationEventHandler; }
public DefaultSubscribeAdapter(IConsumeConfigurator consumeConfigurator, IEnumerable <IEventHandler> integrationEventHandler) { _consumeConfigurator = consumeConfigurator; _integrationEventHandler = integrationEventHandler; _logger = CurrentIocManager.CreateLogger <DefaultSubscribeAdapter>(); }