public async Task ReceiveAsync <TMessage>(string queueName, Func <TMessage, Task> funcAsync) where TMessage : class { await _busReceiver.ReceiveAsync(queueName, null, null, async x => { var message = JsonConvert.DeserializeObject(x.Body, typeof(TMessage)) as TMessage; await funcAsync(message); }); }
public async Task <IBusMessage> ReciveAsync(IBusMessage request) { try { if (!_producer.Push(request)) { throw new Exception("Error: message not sent!"); } CancellationToken token = TokenHelper.GetToken(_config.ResponseTimeout); var result = await _receiver.ReceiveAsync(request, token); if (result == null) { result = request; result.Body = null; } return(result); } catch (Exception e) { _logger?.LogError(e, $"{_connection.ServerInfo}.{typeof(BusQueue).FullName} : {e.Message}"); request.IsError = true; request.ErrorDetails = e.Message; return(request); } }
public async Task StartAsync() { var consumers = Container.GetAll(); var groups = consumers.GroupBy(x => new { x.QueueName, x.ExchangeName, x.Topic }); foreach (var group in groups) { var groupConsumers = group.ToList(); await _bus.ReceiveAsync(group.Key.QueueName, group.Key.ExchangeName, group.Key.Topic, async (message) => { var consumer = groupConsumers.FirstOrDefault(x => x.ContentName == message.ContentName); if (consumer == null) { throw new InvalidOperationException("Consumer not found"); } var messageData = JsonConvert.DeserializeObject(message.Body, consumer.MessageType); using var scope = _serviceProvider.CreateScope(); await consumer.ProcessAsync(scope.ServiceProvider, messageData); }); } }