我正在尝试使用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条消息:
但是,没有关于该主题的消息:
我应该期待有关该主题的相应消息吗?另外,这里的订阅似乎禁用了Sessions似乎也不对吗?
答案 0 :(得分:0)
要在Azure Service Bus中使用会话,必须设置已发送/发布的消息的SessionId,以便Azure为其创建会话。
await InputQueueSendEndpoint.Send(message, context =>
{
context.SetSessionId(message.CorrelationId.ToString());
});
您可以在此处看到工作单元测试示例: