如何解决带有 RabbitMQ 的 MassTransit - 在另一次总线重新启动后发布异常
根据 MassTransit 7.1.0 版本的发行说明,应该可以重新启动总线 - https://masstransit-project.com/releases/v7.1.0.html#re-start-the-bus-finally。
不幸的是,对于配置为使用 RebbitMQ 的 MassTransit,我在另一条总线重新启动后发布消息时出现异常。它在第一次重启后运行良好,但在第二次重启后发布操作抛出 MassTransit.TransportUnavailableException: The RabbitMQ send transport is stopped
。
以下是暴露问题的简单应用程序(使用 MassTransit 7.1.3)代码:
using MassTransit;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using System;
using System.Threading.Tasks;
namespace MassTransitRestartIssue
{
class Program
{
static async Task Main(string[] args)
{
IServiceCollection services = new ServiceCollection();
services.AddLogging(logConfig =>
{
logConfig.AddConsole();
});
services.AddMassTransit(config =>
{
config.AddConsumer<TestConsumer>();
config.UsingRabbitMq((ctx,cfg) =>
{
cfg.Host("localhost","test",h =>
{
h.Username("guest");
h.Password("guest");
});
cfg.ConfigureEndpoints(ctx);
});
});
var serviceProvider = services.BuildServiceProvider();
var busControl = serviceProvider.GetRequiredService<IBusControl>();
var logger = serviceProvider.GetRequiredService<ILogger<Program>>();
await busControl.StartAsync();
try
{
await busControl.Publish(new TestEvent("test message 1"));
// restart bus
await busControl.StopAsync();
await busControl.StartAsync();
await busControl.Publish(new TestEvent("test message 2"));
// another restart bus
await busControl.StopAsync();
await busControl.StartAsync();
await busControl.Publish(new TestEvent("test message 3"));
// throws - MassTransit.TransportUnavailableException: The RabbitMQ send transport is stopped: MassTransitRestartIssue:TestEvent
Console.ReadLine();
}
catch (Exception ex)
{
logger.LogError(ex,"error");
}
finally
{
await busControl.StopAsync();
}
}
}
public record TestEvent(string Message)
{
}
public class TestConsumer :
IConsumer<TestEvent>
{
private readonly ILogger _logger;
public TestConsumer(ILogger<TestConsumer> logger)
{
_logger = logger;
}
public Task Consume(ConsumeContext<TestEvent> context)
{
_logger.LogInformation($"Test event consummed - {context.Message.Message}");
return Task.CompletedTask;
}
}
}
这是错误还是预期行为?如果它打算如何解决问题?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。