示例#1
0
        /// <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);
        }
示例#2
0
 /// <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));
                }
            }));
        }
示例#6
0
 public RabbitMqSubscriptionAdapt(IEnumerable <IEventHandler> handlers, IConsumeConfigurator consumeConfigurator)
 {
     _handlers            = handlers;
     _consumeConfigurator = consumeConfigurator;
 }
示例#7
0
 /// <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;
 }
示例#8
0
 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>();
 }