[英]MassTransit Consumer doesn't consume message from the Azure service bus queue
我有两个服务 API 和 ConsoleApp。 API 将向 Azure 服务总线队列发送消息,并且 ConsoleApp 应该从队列中使用该消息。
长话短说,我可以在队列上使用 MassTransit ISendEndpoint
发送消息(实际消息出现在 Azure 门户 ASB 队列上),但我无法从 ConsoleApp 中使用它。
API.Program.cs
builder.Services.AddMassTransit(mt =>
{
mt.UsingAzureServiceBus((context, cfg) =>
{
string connectionString = "myConnString";
string queue = "test";
cfg.MaxSizeInMegabytes = 5120;
cfg.Host(connectionString);
cfg.ReceiveEndpoint(queue, ec =>
{
ec.MaxSizeInMegabytes = 5120;
ec.DefaultMessageTimeToLive = TimeSpan.FromDays(5);
ec.UseRetry(x => x.Interval(5, TimeSpan.FromSeconds(1)));
ec.UseScheduledRedelivery(x => x.Incremental(5, TimeSpan.FromMinutes(5), TimeSpan.FromMinutes(5)));
});
});
});
在 ConsoleApp 我已经注册了消费者
builder.Services.AddMassTransit(mt =>
{
mt.AddConsumer<MyMessageConsumer>();
mt.UsingAzureServiceBus((context, cfg) =>
{
string connectionString = "myConnString";
string queue = "test";
cfg.MaxSizeInMegabytes = 5120;
cfg.Host(connectionString);
cfg.ReceiveEndpoint(queue, ec =>
{
ec.MaxSizeInMegabytes = 5120;
ec.DefaultMessageTimeToLive = TimeSpan.FromDays(5);
ec.ConfigureConsumer<MyMessageConsumer>(context);
ec.UseRetry(x => x.Interval(5, TimeSpan.FromSeconds(1)));
ec.UseScheduledRedelivery(x => x.Incremental(5, TimeSpan.FromMinutes(5), TimeSpan.FromMinutes(5)));
});
});
和实际消费者
public class MyMessageConsumer : IConsumer<MyMessage>
{
public Task Consume(ConsumeContext<MyMessage> context)
{
return Task.CompletedTask;
}
}
});
我已经使用接收端点注册了消费者以侦听特定队列,但我仍然无法使用消息(消息仍然出现在队列中)。 我在这里做错了什么?
更新:我的 API.Startup 现在按照以下答案的建议使用最少的 MassTransit 配置进行配置
builder.Services.AddMassTransit(mt =>
{
mt.UsingAzureServiceBus((context, cfg) =>
{
string connectionString = "myConnString";
cfg.Host(connectionString);
});
});
它仍然成功地将消息发送到队列,并且仍然不会从其他项目中的消费者那里消费。 skipped_queue 中没有消息。
好吧,您可能正在使用来自 API 的消息,并且它正在被移动到 _skipped 队列中。 您的 API 应该具有最小的 MassTransit 配置,因为它不消耗消息:
builder.Services.AddMassTransit(mt =>
{
mt.UsingAzureServiceBus((context, cfg) =>
{
string connectionString = "myConnString";
string queue = "test";
cfg.Host(connectionString);
cfg.MaxSizeInMegabytes = 5120;
});
});
在您的消费者服务中,您也应该使用正确的配置(您使用过时的方法并且配置无序,基本上使它们不存在)。
builder.Services.AddMassTransit(mt =>
{
mt.AddConsumer<MyMessageConsumer>();
mt.UsingAzureServiceBus((context, cfg) =>
{
string connectionString = "myConnString";
string queue = "test";
cfg.Host(connectionString);
cfg.ReceiveEndpoint(queue, ec =>
{
ec.MaxSizeInMegabytes = 5120;
ec.DefaultMessageTimeToLive = TimeSpan.FromDays(5);
ec.UseMessageRetry(x => x.Interval(5, TimeSpan.FromSeconds(1)));
ec.UseDelayedRedelivery(x => x.Incremental(5, TimeSpan.FromMinutes(5), TimeSpan.FromMinutes(5)));
ec.ConfigureConsumer<MyMessageConsumer>(context);
});
});
此外,请确保MyMessage
位于两个项目的相同命名空间中,否则将不会使用该消息。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.