【发布时间】: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