未使用MassTransit RabbitMq消息,C#

r1wp621o  于 2023-02-04  发布在  RabbitMQ
关注(0)|答案(1)|浏览(182)

我在ASP NET核心3.1 MVC中有图书馆API,用户可以在那里借阅,归还和跟踪借书状态。我想创建电子邮件通知,这样当图书归还时,所有跟踪此特定图书状态的用户都将收到可用的电子邮件通知。
我想使用RabbitMQ与大众运输和处理不同的网络服务上的电子邮件。
这是我的代码,它向rabbit队列发送消息:

public async Task SendNotificationStatus(Book book, CancellationToken cancellationToken)
        {
            var endpoint = await _bus.GetSendEndpoint(new System.Uri($"rabbitmq://{_rabbitHostName}/library-notifications"));
            var bookSpectators = await _userRepository.GetSpectatorsByBookId(book.Id, cancellationToken);

            foreach (var user in bookSpectators)
            {
                NotifyStatusReturn rabbitMessage = new NotifyStatusReturn
                {
                    NotificationType = NotificationTypes.BookReturn,
                    RecipientAddress = user.EmailAddress,
                    RecipientLogin = user.Login,
                    SentDate = DateTime.UtcNow,
                    BookTitle = book.Title
                };
                await endpoint.Send(rabbitMessage);
            }
        }

至于通知服务,我使用MassTransit网站(www.example.com)上提供的模板创建了该项目https://masstransit-project.com/usage/templates.html#installation
首先我运行dotnet new mtworker -n LibraryNotifications,然后进入项目文件夹dotnet new mtconsumer
我已经通过NugerPackage管理器添加了MassTransit.RabbitMq 8.0.0包。
在通过mtconsumer模板创建的Contracts文件夹中,我将记录的名称更改为NotifyStatusReturn,如下所示:

namespace Contracts
{
    public record NotifyStatusReturn
    {
        public string NotificationType { get; set; }
        public string RecipientAddress { get; set; }
        public string RecipientLogin { get; set; }
        public DateTime SentDate { get; set; }
        public string BookTitle { get; set; }
    }
}

Program.cs中,将x.UsingInMemory()替换为

x.UsingRabbitMq((context, cfg) =>
{
    cfg.Host("localhost", "/", h =>
    {
        h.Username("guest");
        h.Password("guest");
    });
    cfg.ConfigureEndpoints(context);
});

当我还书时,消息作为dead-letter进入library-notifications_skipped队列。所有的绑定对我来说似乎都没问题,我真的不知道我的消息没有被使用的原因是什么。有人能帮助我解决这个问题吗?

bpzcxfmw

bpzcxfmw1#

根据the documentation
MassTransit对消息协定使用完整的类型名称,包括命名空间。在两个单独的项目中创建相同的消息类型时,命名空间必须匹配,否则将不会使用消息。
确保您的消息类型在每个项目中具有相同的名称空间/类型。

相关问题