繁体   English   中英

使用 Azure 服务总线在 MassTransit IPublishEndpoint 上调用 Publish() 不会返回

[英]Calling Publish() on MassTransit IPublishEndpoint with Azure Service Bus doesn't return

我在使用 Mass Transit 将消息发布到 Azure 服务总线时遇到问题。 IBusIPublishEndpoint上调用await Publish()不会返回。 当我将提供程序切换到InMemory时,它按预期返回。

为了缩小问题范围,我使用了 MassTransit AzureServiceBus 示例应用程序https://github.com/MassTransit/Sample-AzureServiceBus 仅在 appsettings.json 中设置连接字符串,并保留默认启动配置指向 ASB

services.AddMassTransit(x =>
{
    x.SetKebabCaseEndpointNameFormatter();

    x.UsingAzureServiceBus((_, cfg) =>
    {
        cfg.Host(Configuration.GetConnectionString("AzureServiceBus"));

        cfg.Send<OrderShipped>(s => s.UseSessionIdFormatter(c => c.Message.OrderId.ToString("D")));
    });
});

ShipmentController中点击Put()端点时, await _publishEndpoint.Publish()调用不会返回。 return Ok()永远不会到达。

namespace Sample.Api.Controllers
{
    using System;
    using System.Threading.Tasks;
    using Contracts;
    using MassTransit;
    using Microsoft.AspNetCore.Mvc;
    using Microsoft.Extensions.Logging;


    [ApiController]
    [Route("[controller]")]
    public class ShipmentController :
        ControllerBase
    {
        readonly ILogger<ShipmentController> _logger;
        readonly IPublishEndpoint _publishEndpoint;

        public ShipmentController(ILogger<ShipmentController> logger, IPublishEndpoint publishEndpoint)
        {
            _logger = logger;
            _publishEndpoint = publishEndpoint;
        }

        [HttpPut]
        public async Task<IActionResult> Put(Guid orderId)
        {
            await _publishEndpoint.Publish(new OrderShipped
            {
                OrderId = orderId,
                Timestamp = DateTimeOffset.Now
            });

            return Ok(new {OrderId = orderId});
        }
    }
}

切换到 InMemory 时, ShipmentController中的await _publishEndpoint.Publish()按预期返回。

services.AddMassTransit(x =>
{
    x.SetKebabCaseEndpointNameFormatter();

    x.UsingInMemory((context, cfg) =>
    {
        cfg.Send<OrderShipped>(s => s.UseSessionIdFormatter(c => c.Message.OrderId.ToString("D")));
    });
});

您应该查看日志,但我猜您的总线无法连接到 Azure。 防火墙等可能是根本原因,它与 MassTransit 本身无关。

您还应该将CancellationToken从控制器传递给Publish ,以便在控制器发出取消信号时取消调用。

我看到 Wireshark 拒绝了端口 5671 上的请求。 按照此处https://stackoverflow.com/a/60333992/1573728的建议将TransportType切换为AmqpWebSockets (端口 443)就可以了,所以肯定是防火墙问题。

services.AddMassTransit(x =>
{
    x.SetKebabCaseEndpointNameFormatter();

    x.UsingAzureServiceBus((_, cfg) =>
    {
        cfg.Host(Configuration.GetConnectionString("AzureServiceBus"), cfg => cfg.TransportType = ServiceBusTransportType.AmqpWebSockets);

        cfg.Send<OrderShipped>(s => s.UseSessionIdFormatter(c => c.Message.OrderId.ToString("D")));
    });
}

在我看来,MassTransit 应该在某个时候抛出异常,因为它无法发布,或者仅仅是因为超时。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM