我在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
队列。所有的绑定对我来说似乎都没问题,我真的不知道我的消息没有被使用的原因是什么。有人能帮助我解决这个问题吗?
1条答案
按热度按时间bpzcxfmw1#
根据the documentation:
MassTransit对消息协定使用完整的类型名称,包括命名空间。在两个单独的项目中创建相同的消息类型时,命名空间必须匹配,否则将不会使用消息。
确保您的消息类型在每个项目中具有相同的名称空间/类型。