Пример #1
0
 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);
     });
 }
Пример #2
0
        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);
            }
        }
Пример #3
0
        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);
                });
            }
        }