public ValuesController(IEventBus eventBus, IHttpClient httpClient, IHummingbirdCache <string> cache)
        {
            _eventBus   = eventBus;
            _httpClient = httpClient;
            _cache      = cache;

            _cache.Add("11", "test", TimeSpan.FromMinutes(5), "ProjectName:Enviroment1:Regsion1");
            _cache.Add("22", "test", TimeSpan.FromMinutes(5), "ProjectName:Enviroment2:Regsion1");
            _cache.Add("33", "test", TimeSpan.FromMinutes(5), "ProjectName:Enviroment1:Regsion2");
            _cache.Add("44", "test", TimeSpan.FromMinutes(5), "ProjectName:Enviroment2:Regsion2");
        }
示例#2
0
        public ClientRequest CreateRequestForCommand <T, R>(
            string Id,
            System.DateTime RequestTime,
            System.DateTime ResponseTime,
            T command,
            R response)
        {
            var cached = Find(Id);

            if (cached == null)
            {
                cached = new ClientRequest()
                {
                    Id           = Id,
                    Name         = typeof(T).Name,
                    RequestTime  = RequestTime,
                    ResponseTime = ResponseTime,
                    Request      = Newtonsoft.Json.JsonConvert.SerializeObject(command),
                    Response     = Newtonsoft.Json.JsonConvert.SerializeObject(response)
                };
                _cacheManager.Add(Id, cached, _option.Druation, _option.CacheRegion);
            }

            return(cached);
        }
示例#3
0
        /// <summary>
        /// 订阅消息(同一类消息可以重复订阅)
        /// 作者:郭明
        /// 日期:2017年4月3日
        /// </summary>
        /// <typeparam name="TD"></typeparam>
        /// <typeparam name="TH"></typeparam>
        /// <param name="EventTypeName">消息类型名称</param>
        /// <returns></returns>
        public IEventBus Register <TD, TH>(string EventTypeName = "")
            where TD : class
            where TH : IEventHandler <TD>
        {
            if (!_persistentConnection.IsConnected)
            {
                _persistentConnection.TryConnect();
            }

            var _channel         = _persistentConnection.CreateModel();
            var policy           = createPolicy();
            var msgHandlerPolicy = Policy <Boolean> .Handle <Exception>().FallbackAsync(false)
                                   .WrapAsync(policy);

            var _queueName  = typeof(TH).FullName;
            var _routeKey   = string.IsNullOrEmpty(EventTypeName) ? typeof(TD).FullName : EventTypeName;
            var EventAction = _lifetimeScope.GetService(typeof(TH)) as IEventHandler <TD>;

            if (EventAction == null)
            {
                EventAction = System.Activator.CreateInstance(typeof(TH)) as IEventHandler <TD>;
            }

            //direct fanout topic
            _channel.ExchangeDeclare(_exchange, _exchangeType, true, false, null);

            //在MQ上定义一个持久化队列,如果名称相同不会重复创建
            _channel.QueueDeclare(_queueName, true, false, false, null);
            //绑定交换器和队列
            _channel.QueueBind(_queueName, _exchange, _routeKey);
            //输入1,那如果接收一个消息,但是没有应答,则客户端不会收到下一个消息
            _channel.BasicQos(0, _preFetch, false);
            //在队列上定义一个消费者a
            EventingBasicConsumer consumer = new EventingBasicConsumer(_channel);

            consumer.Received += async(ch, ea) =>
            {
                if (!_persistentConnection.IsConnected)
                {
                    _persistentConnection.TryConnect();
                }
                byte[] bytes;
                string str     = string.Empty;
                var    msg     = default(TD);
                var    EventId = ea.BasicProperties.MessageId;
                if (string.IsNullOrEmpty(EventId) || _IdempotencyDuration == 0 || !_cacheManager.Exists(EventId, "Events"))
                {
                    try
                    {
                        bytes = ea.Body;
                        str   = Encoding.UTF8.GetString(bytes);
                        msg   = JsonConvert.DeserializeObject <TD>(str);

                        var handlerOK = await msgHandlerPolicy.ExecuteAsync(async (cancellationToken) =>
                        {
                            return(await EventAction.Handle(msg, cancellationToken));
                        }, CancellationToken.None);

                        if (handlerOK)
                        {
                            if (_subscribeAckHandler != null)
                            {
                                _subscribeAckHandler(new string[] { EventId }, _queueName);
                            }

                            //回复确认
                            _channel.BasicAck(ea.DeliveryTag, false);

                            //消费端保证幂等时需要积
                            if (_IdempotencyDuration > 0 && !string.IsNullOrEmpty(EventId))
                            {
                                _cacheManager.Add(EventId, true, TimeSpan.FromSeconds(_IdempotencyDuration), "Events");
                            }
                        }
                        else
                        {
                            var requeue = true;

                            if (_subscribeNackHandler != null)
                            {
                                requeue = await _subscribeNackHandler(new string[] { EventId }, _queueName, null, new dynamic[] { msg });
                            }

                            //拒绝重新写入队列,处理
                            _channel.BasicReject(ea.DeliveryTag, requeue);
                        }
                    }
                    catch (Exception ex)
                    {
                        var requeue = true;

                        if (_subscribeNackHandler != null)
                        {
                            requeue = await _subscribeNackHandler(new string[] { EventId }, _queueName, ex, new dynamic[] { msg });
                        }
                        _channel.BasicReject(ea.DeliveryTag, requeue);
                    }
                }
                else
                {
                    //回复确认
                    _channel.BasicAck(ea.DeliveryTag, false);
                }
            };

            consumer.Unregistered += (ch, ea) =>
            {
                _logger.LogDebug($"MQ:{_queueName} Consumer_Unregistered");
            };

            consumer.Registered += (ch, ea) =>
            {
                _logger.LogDebug($"MQ:{_queueName} Consumer_Registered");
            };

            consumer.Shutdown += (ch, ea) =>
            {
                _logger.LogDebug($"MQ:{_queueName} Consumer_Shutdown.{ea.ReplyText}");
            };

            consumer.ConsumerCancelled += (object sender, ConsumerEventArgs e) =>
            {
                _logger.LogDebug($"MQ:{_queueName} ConsumerCancelled");
            };

            //消费队列,并设置应答模式为程序主动应答
            _channel.BasicConsume(_queueName, false, consumer);

            _subscribeChannels.Add(_channel);
            return(this);
        }