如果消息代理关闭,是否有可能引发异常?
Is there a possibility to raise an exception if message broker is down?
我将 Masstransit 与 RabbitMQ、log4net 一起用于日志记录,一切正常。但是当 RabbitMQ 服务器关闭时,我注意到日志中充满了错误:
ERROR - RabbitMQ Connect Failed: Broker unreachable: localhost:5672/
但仍然可以无限制地发布消息。看起来像这样的消息发送然后消失。
是否有可能引发此类异常并手动处理它们?或者我可以以某种方式强制 Publish
方法在代理关闭时抛出 Exception
吗?
下面是我的总线设置:
var busControl = Bus.Factory.CreateUsingRabbitMq(cfg =>
{
var host = cfg.Host(new Uri("rabbitmq://localhost/"), h =>
{ });
cfg.UseLog4Net();
cfg.ReceiveEndpoint("test-queue", ep =>
{
ep.StateMachineSaga(context.Resolve<ProductSaga>(),
context.Resolve<ILifetimeScope>());
if (ep is IRabbitMqReceiveEndpointConfigurator)
{
((IRabbitMqReceiveEndpointConfigurator)ep).PrefetchCount = 8;
}
ep.UseInMemoryOutbox();
});
});
您需要按照文档中的描述使用观察器:
还有接收端点观察器,它没有记录但用于健康检查。
比如在健康检查中,我们这样使用bus observer:
public class ReceiveEndpointHealthCheck :
IReceiveEndpointObserver
{
// some more stuff
public Task Faulted(ReceiveEndpointFaulted faulted)
{
var endpoint = GetEndpoint(faulted.InputAddress);
endpoint.Ready = false;
endpoint.LastException = faulted.Exception;
return TaskUtil.Completed;
}
}
你可以实例化这样一个观察者然后调用bus.ConnectReceiveEndpointObserver(receiveEndpointCheck)
.
我还建议使用 health checks,因为这是确定您的服务是否健康的默认方式,而不仅仅是 RMQ。
我将 Masstransit 与 RabbitMQ、log4net 一起用于日志记录,一切正常。但是当 RabbitMQ 服务器关闭时,我注意到日志中充满了错误:
ERROR - RabbitMQ Connect Failed: Broker unreachable: localhost:5672/
但仍然可以无限制地发布消息。看起来像这样的消息发送然后消失。
是否有可能引发此类异常并手动处理它们?或者我可以以某种方式强制 Publish
方法在代理关闭时抛出 Exception
吗?
下面是我的总线设置:
var busControl = Bus.Factory.CreateUsingRabbitMq(cfg =>
{
var host = cfg.Host(new Uri("rabbitmq://localhost/"), h =>
{ });
cfg.UseLog4Net();
cfg.ReceiveEndpoint("test-queue", ep =>
{
ep.StateMachineSaga(context.Resolve<ProductSaga>(),
context.Resolve<ILifetimeScope>());
if (ep is IRabbitMqReceiveEndpointConfigurator)
{
((IRabbitMqReceiveEndpointConfigurator)ep).PrefetchCount = 8;
}
ep.UseInMemoryOutbox();
});
});
您需要按照文档中的描述使用观察器:
还有接收端点观察器,它没有记录但用于健康检查。
比如在健康检查中,我们这样使用bus observer:
public class ReceiveEndpointHealthCheck :
IReceiveEndpointObserver
{
// some more stuff
public Task Faulted(ReceiveEndpointFaulted faulted)
{
var endpoint = GetEndpoint(faulted.InputAddress);
endpoint.Ready = false;
endpoint.LastException = faulted.Exception;
return TaskUtil.Completed;
}
}
你可以实例化这样一个观察者然后调用bus.ConnectReceiveEndpointObserver(receiveEndpointCheck)
.
我还建议使用 health checks,因为这是确定您的服务是否健康的默认方式,而不仅仅是 RMQ。