无法通过主传输发送消息Broker不可达:guest@localhost:5672/



我是新手。我创建了一个。net core 5.0 web api项目。

最初,我在启动时得到下面的错误。我正在尝试发送我的消息时收到错误。

目标:通过干线发送消息

错误:警告:公交[0]一体化重试00:00:08.1220000:Broker不可达:guest@localhost:5672/MassTransit.RabbitMqTransport.RabbitMqConnectionException: Broker unreachable: guest@localhost:5672/——比;RabbitMQ.Client.Exceptions.BrokerUnreachableException:指定的所有端点都不可达——比;系统。AggregateException:发生了一个或多个错误。(连接失败)——比;RabbitMQ.Client.Exceptions.ConnectFailureException:连接失败——比;System.Net.Sockets.SocketException (111): Connection refused

我创建了一个docker-compose文件
version: '3.4'
networks:
poc:
services:
rabbitmq:
image: masstransit/rabbitmq:latest
networks:
- poc
container_name: rabbitmq
environment:
RABBITMQ_ERLANG_COOKIE: ${RABBITMQ_ERLANG_COOKIE}
RABBITMQ_DEFAULT_USER: ${RABBITMQ_DEFAULT_USER}
RABBITMQ_DEFAULT_PASS: ${RABBITMQ_DEFAULT_PASS}
ports:
- 5672:5672
- 15672:15672
webapi:
image: ${DOCKER_REGISTRY-}webapi
build:
context: .
dockerfile: WebApi/Dockerfile
ports:
- 5100:80

test:
image: ${DOCKER_REGISTRY-}test
build:
context: .
dockerfile: Test/Dockerfile
ports:
- 5101:80

在我的startup.cs关于WebApi一边…

services.AddMassTransit(mt =>
{
mt.UsingRabbitMq((context, cfg) =>
{
cfg.AutoStart = true;
cfg.Host("rabbitmq");
cfg.UseRabbitMqMessageScheduler();
cfg.ConfigureEndpoints(context);
});
});
<我>控制器strong>
public class OrderController : Controller
{
private readonly IBusControl _bus;
public OrderController(IBusControl bus)
{
_bus = bus;
}
[HttpPost("api/order")]
public async Task<IActionResult> Index([FromBody] Order order)
{
try
{
Uri uri = new Uri("queue:order-queue");
var endpoint = await _bus.GetSendEndpoint(uri);
await endpoint.Send(order);
return Ok("Success");
}
catch (Exception exception)
{
return StatusCode(500, exception);
}
}
}

当我在Docker中运行服务时,我发现localhost不工作。因此,我使用检查来查看我是否在容器中并使用rabbitmq主机名(或您的RabbitMQ容器的任何主机名都在docker-compose.yml中)。

static bool? _isRunningInContainer;
static bool IsRunningInContainer =>
_isRunningInContainer ??= bool.TryParse(Environment.GetEnvironmentVariable("DOTNET_RUNNING_IN_CONTAINER"), out var inContainer) && inContainer;

则,在UsingRabbitMq中:

if (IsRunningInContainer)
cfg.Host("rabbitmq");

如果你需要看看它是如何连接的,这是一个工作示例。

相关内容

最新更新