首页 > 解决方案 > 通过 RabbitMQ 从生产者传递到接收者类

问题描述

有两种服务,API 和 smtp。用于购买某些产品的 API。当用户下订单时,他应该在他订购的邮件中收到一封信。

[HttpPost]
        public async Task<IActionResult> Add(OrderCreateModel orderModel)
        {
            var orderAdd = _mapper.Map<OrderDto>(orderModel);
            var orderCreated = await _orderService.AddAsync(orderAdd);

            _messageService.Enqueue(orderCreated);
            return CreatedAtAction(nameof(GetId), new { id = orderCreated.Id }, orderModel);
        }

以下是收到订单时触发我的 SMTP 服务的方式:

public Task StartAsync(CancellationToken cancellationToken)
        {
            var factory = new ConnectionFactory()
            {
                HostName = _rabbitSettings.Value.HostName,
                UserName = _rabbitSettings.Value.UserName,
                Password = _rabbitSettings.Value.Password,
                Port = _rabbitSettings.Value.Port,
                VirtualHost = _rabbitSettings.Value.VirtualHost,
                AutomaticRecoveryEnabled = _rabbitSettings.Value.AutomaticRecoveryEnabled
            };

            IConnection connection = factory.CreateConnection();
            IModel model = connection.CreateModel();

            model.QueueDeclare(queue: "order",
                        durable: false,
                        exclusive: false,
                        autoDelete: false,
                        arguments: null);

            var consumer = new EventingBasicConsumer(model);

            consumer.Received += async (sender, e) =>
            {
                var body = Deserialize<Mail>(e.Body.ToArray());
                await _mailService.SendMessageAsync(body);
            };
            
            model.BasicConsume("order", true, consumer);

            return Task.CompletedTask;
        }

哪个调用服务已经发送:

public async Task SendMessageAsync(Mail mail)
        {
            var email = new MimeMessage();
            email.Sender = MailboxAddress.Parse(_mailSettings.Value.Mail);
            email.To.Add(MailboxAddress.Parse(mail.Email));
            email.Subject = mail.Subject;

            var builder = new BodyBuilder();
            builder.HtmlBody = mail.Body;
            email.Body = builder.ToMessageBody();

            using var smtp = new SmtpClient();
            smtp.Connect(_mailSettings.Value.Host, _mailSettings.Value.Port, SecureSocketOptions.StartTls);
            smtp.Authenticate(_mailSettings.Value.Mail, _mailSettings.Value.Password);

            await smtp.SendAsync(email);
            smtp.Disconnect(true);
        }

这是硬编码的模型:

public class Mail
    {
        public string Email { get; set; } = "testingServiceSMTP@gmail.com";
        public string Subject { get; set; } = "Greetings!";
        public string Body { get; set; } = "Greetings!";
    }

订单的结构如下:

{
    "city": "Somecity",
    "country": "SomeCountr",
    "zipCode": "43523",
    "userId": 1
}

那么我可以将订单详细信息传递给 Mail 吗?

标签: asp.netasp.net-corerabbitmq

解决方案


推荐阅读