【问题标题】:MassTransit failing to consumeMassTransit 消费失败
【发布时间】:2021-09-08 05:30:43
【问题描述】:

我正在切换一些使用 MassTransit(.NET 5 上的 v7.2.2)的代码以使用更具声明性的格式(并且远离对 ReceiveEndpoint() 的多次调用),理想情况下是使用 ConsumerDefinitions 进行配置(尽管不是一部分为简单起见),以及一些使用 Quartz.NET 的依赖注入(从这个示例中提取,尽管它运行 3.3.3),这样做我现在发现我的消费者没有消费,尽管发送了消息并引用了示例.以 MassTransit 服务为例:

        var hostBuilder = Host.CreateDefaultBuilder(args)
            .ConfigureServices((hostContext, services) =>
            {
                services.AddMassTransit(mt =>
                {
                    mt.AddBus(provider => Bus.Factory.CreateUsingInMemory(cfg =>
                    {
                        //cfg.AutoStart = true; //No change when on
                        cfg.UseInMemoryOutbox();
                        cfg.ConfigureEndpoints(provider);
                    }));

                    mt.AddConsumer<TheMessageConsumer>();
                    services.AddMediator(cfg =>
                    {
                        cfg.AddConsumer<TheMessageConsumer>();
                    });
                });

                services.AddMassTransitHostedService();
            });
        var host = hostBuilder.Build();
        var busControl = host.Services.GetService<IBusControl>();

        busControl.Start(); //Just in case

        var message = new TheMessage() { Message = $"<Message-{DateTime.Now.ToLongTimeString()}>" };
        Console.WriteLine($"Sending: {message.Message}");
        await busControl.Publish(message);

        host.Run();

请注意,此处中断消息发送是为了简化我的复制,因为在我的完整代码库中,它是由 Quartz 解雇的作业发送的。

对于这个例子,消息和接收者也很简单:

    public class TheMessage
    {
        public string Message { get; set; }
    }

    public class TheMessageConsumer : IConsumer<TheMessage>
    {
        public Task Consume(ConsumeContext<TheMessage> context)
        {
            Console.WriteLine($"Message received: {context.Message.Message}");

            return Task.CompletedTask;
        }
    }

总线已启动,在我明确启动它的情况下,设置了 AutoStart 标志,或者 MassTransitHostedService 启动了它,但没有收到消息。如果我有完整的例子,Quartz 会在很久以后用消息启动作业。

有人可以建议我缺少什么吗?

【问题讨论】:

    标签: masstransit


    【解决方案1】:

    您发布的代码确实是 sn-ps 的大杂烩,一起使用时没有任何意义。例如,AddBus 已被弃用,调解员根本与该项目无关。

    我建议使用MassTransit Templates 之一从头开始创建一个新项目(您可能需要将 NuGet 版本升级到 7.2.2)。

    Watch this video 解释了模板以及如何使用它们。

    有了您的评论和更新的问题,您实际上只需要以下内容:

    var hostBuilder = Host.CreateDefaultBuilder(args)
        .ConfigureServices((hostContext, services) =>
        {
            services.AddMassTransit(mt =>
            {
                mt.AddConsumer<TheMessageConsumer>();
    
                mt.UsingInMemory((context,cfg) =>
                {
                    cfg.UseInMemoryOutbox();
                    cfg.ConfigureEndpoints(context);
                }));
            });
    
            services.AddMassTransitHostedService();
        });
    var host = hostBuilder.Build();
    
    await host.RunAsync();
    

    如果您想对其进行测试,并在同一进程中发送消息,只需添加一个BackgroundService(在AddMassTransitHostedService 之后)即可发布您的消息。

    在公共汽车启动之前,您不应该发布。

    【讨论】:

    • 你说得对,sn-p 是经过几个小时的搜索、阅读、测试和挫折后组装而成的。例如,AddBus 实际上是从(以前的)官方文档中处理的:masstransit-v6.netlify.app/usage/… 我尝试了您建议的模板视频和 NuGet,结果相同,尽管构造和注册了消费者,但消息被发送,但没有被消费。也将使用该版本更新 Q。
    • 答案已更新,以尝试了解您真正需要做什么才能使其正常工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多