繁体   English   中英

MassTransit Consumer 不使用来自 Azure 服务总线队列的消息

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM