[英]Publish to Azure Service Bus using MassTransit is causing errors
[英]Calling Publish() on MassTransit IPublishEndpoint with Azure Service Bus doesn't return
我在使用 Mass Transit 将消息发布到 Azure 服务总线时遇到问题。 在IBus
或IPublishEndpoint
上调用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.