使用AzureServiceBus的MassTransit传奇静默失败

时间:2019-01-14 04:28:01

标签: .net-core azureservicebus masstransit

我正在尝试使用AzureServiceBus和.NET Core创建MassTransit传奇。

我有一个ASP.NET Core应用程序,该应用程序已成功将消息发送到队列。它在Startup.cs中具有以下配置:

services.AddSingleton(provider => Bus.Factory.CreateUsingAzureServiceBus(cfg =>
{
    cfg.Host(
        new Uri("https://zzz.servicebus.windows.net/"),
        h =>
        {
            h.TransportType = TransportType.AmqpWebSockets;
            h.OperationTimeout = TimeSpan.FromSeconds(5);
            h.RetryLimit = 1;
            h.TokenProvider = TokenProvider.CreateSharedAccessSignatureTokenProvider("RootManageSharedAccessKey", "xxx");
        });

    cfg.RequiresSession = true;
}));

EndpointConvention.Map<MassTransit.POC.Shared.IPurchasePolicyMessage>(
    new Uri("https://zzz.servicebus.windows.net/masstransitqueue"));

services.AddSingleton<ISendEndpointProvider>(provider => provider.GetRequiredService<IBusControl>());

,此代码在发送消息的控制器中:

var sendEndpoint = await _sendEndpointProvider.GetSendEndpoint(new Uri("https://zzz.servicebus.windows.net/masstransitqueue"));

await
  sendEndpoint.Send<IPurchasePolicyMessage>(
    new
    {
      QuoteNumber = policyNumber,
      CorrelationId = NewId.NextGuid().ToString("D")
    }, context =>
    {
      context.SetSessionId(context.Message.CorrelationId.ToString());
    }).ConfigureAwait(false);

我有一个单独的.NET Core控制台应用程序,正在接收IPurchasePolicyMessage。在Program.cs中具有以下配置:

var bus = Bus.Factory.CreateUsingAzureServiceBus(cfg =>
{
    var host = cfg.Host(
        new Uri("https://zzz.servicebus.windows.net/"),
        h =>
        {
            h.TransportType = TransportType.AmqpWebSockets;
            h.OperationTimeout = TimeSpan.FromSeconds(5);
            h.RetryLimit = 1;
            h.TokenProvider = TokenProvider.CreateSharedAccessSignatureTokenProvider("RootManageSharedAccessKey", "xxx");
        });

    cfg.RequiresSession = true;

    cfg.ReceiveEndpoint(host, "masstransitqueue", e =>
    {
        e.RequiresSession = true;
        //e.Consumer<PurchasePolicyConsumer>();
        e.Saga<PurchasePolicySaga>(new MessageSessionSagaRepository<PurchasePolicySaga>());
    });
});

bus.Start();

和PurchasePolicySaga定义为:

public class PurchasePolicySaga :
    ISaga,
    InitiatedBy<IPurchasePolicyMessage>
{
    public Guid CorrelationId { get; set; }

    public async Task Consume(ConsumeContext<IPurchasePolicyMessage> context)
    {
        await Console.Out.WriteLineAsync($"Processing policy number {context.Message.QuoteNumber} in saga.");
    }
}

从不调用这里的Consume方法。没有错误,日志中没有与传入消息相关的活动,什么也没有发生。有人可以告诉我如何找到原因吗?

我强烈怀疑问题与会话有关,因为当我将传奇更改为简单的使用者时,删除“ RequiresSession”标志并删除队列以使MassTransit重新创建它就可以了。但是,由于基于AzureServiceBus的MassTransit传奇需要会话,因此我有些困惑。

进一步调查

查看Azure仪表板中的消息,我看到消息正在发送到队列中。此屏幕快照显示了3条消息:

azure queue screenshot

但是,没有关于该主题的消息:

azure topic screenshot

我应该期待有关该主题的相应消息吗?另外,这里的订阅似乎禁用了Sessions似乎也不对吗?

1 个答案:

答案 0 :(得分:0)

要在Azure Service Bus中使用会话,必须设置已发送/发布的消息的SessionId,以便Azure为其创建会话。

await InputQueueSendEndpoint.Send(message, context =>
{
    context.SetSessionId(message.CorrelationId.ToString());
});

您可以在此处看到工作单元测试示例:

https://github.com/MassTransit/MassTransit/blob/develop/src/MassTransit.AzureServiceBusTransport.Tests/Session_Specs.cs