private void ListeningMq(RedisReliableQueue <string> redisReliableQueue) { while (true) { try { var queue = redisReliableQueue; var msg = queue.TakeOne(1); if (msg != null) { var message = JsonConvert.DeserializeObject <TransportMessage>(msg); message.Headers.Add(Headers.Group, _queueName); OnMessageReceived?.Invoke(message.GetId(), message); // 确认消息 queue.Acknowledge(new[] { msg }); } else { // 没事干,歇一会 System.Threading.Tasks.Task.Delay(1000); } } catch (Exception ex) { OnLog?.Invoke(this, new LogMessageEventArgs() { LogType = MqLogType.ExceptionReceived, Reason = $"{_queueName}-{redisReliableQueue.Key}-{ex.Message}" }); //throw; } } }
protected async Task ExecuteAsync(CancellationToken stoppingToken) { await Task.Yield(); // Redis 可信消息队列,支持消费确认 _queue = _redis.GetReliableQueue <String>("rdsTopic"); await _queue.ConsumeAsync <Area>(area => { XTrace.WriteLine("RedisQueue.Consume {0} {1}", area.Code, area.Name); }, stoppingToken, _log); }
static void AssignProducer() { var set = master.GetSet <string>("testList"); if (ListContainer == null) { lock (_lock) { if (ListContainer != null) { return; } foreach (var item in set) { if (master.Get <bool>(item)) { ListContainer = master.GetReliableQueue <string>(item + "BQueue"); } } } } else if (ListContainer.Count >= maxContainerNumber) { lock (_lock) { if (ListContainer.Count < maxContainerNumber) { return; } foreach (var item in set) { if (item != ListContainer.Key.Replace("BQueue", "")) { master.Set(ListContainer.Key.Replace("BQueue", ""), false); ListContainer = master.GetReliableQueue <string>(item + "BQueue"); master.Execute(item + "BQueue", client => client.Execute <string>("LTRIM", item + "BQueue", "1", "0")); master.Set(item, true); return; } } } } }
static void AssignConsumer() { if (SlaveListContainer == null) { lock (_slavelock) { if (SlaveListContainer != null) { return; } var set = slave1.GetSet <string>(ListKey); foreach (var item in set) { if (slave1.Get <bool>(item)) { currentKey = item; SlaveListContainer = slave1.GetReliableQueue <string>(item + "BQueue"); return; } } } } else if (!slave1.Get <bool>(currentKey) && SlaveListContainer.Count == 0) { lock (_slavelock) { if (slave1.Get <bool>(currentKey)) { return; } var set = slave1.GetSet <string>(ListKey); foreach (var item in set) { if (slave1.Get <bool>(item)) { currentKey = item; SlaveListContainer = slave1.GetReliableQueue <string>(item + "BQueue"); return; } } } } }