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