簡體   English   中英

MassTransit 未訂閱 AzureServiceBus 主題

[英]MassTransit not subscribing to AzureServiceBus Topic

我目前正在嘗試使用 MassTransit 6.3.2 更新最初是 .NET Core 3.1 的應用程序。 它現在配置為使用 .NET 6.0 和 MassTransit 7.3.0

我們的應用程序使用 MassTransit 通過 Azure 服務總線發送消息,將消息發布到主題,然后讓其他訂閱者監聽這些主題。

減少,它是這樣實現的:

// Program.cs
services.AddMassTransit(config =>
{
   config.AddConsumer<AppointmentBookedMessageConsumer>();
   config.AddBus(BusControlFactory.ConfigureAzureServiceBus);
});


// BusControlFactory.cs
public static class BusControlFactory
{
   public static IBusControl ConfigureAzureServiceBus(IRegistrationContext<IServiceProvider> context)
   {
      var config = context.Container.GetService<AppConfiguration>();
      var azureServiceBus = Bus.Factory.CreateUsingAzureServiceBus(busFactoryConfig =>
      {
         busFactoryConfig.Host("Endpoint=sb://REDACTED-queues.servicebus.windows.net/;SharedAccessKeyName=MyMessageQueuing;SharedAccessKey=MyKeyGoesHere");
         busFactoryConfig.Message<AppointmentBookedMessage>(m => m.SetEntityName("appointment-booked"));
         busFactoryConfig.SubscriptionEndpoint<AppointmentBookedMessage>(
            "my-subscriber-name",
            configurator =>
            {
               configurator.UseMessageRetry(r => r.Interval(5, TimeSpan.FromSeconds(60)));
               configurator.Consumer<AppointmentBookedMessageConsumer>(context.Container);
            });
         return azureServiceBus;
      }
   }
}

它現在已更改並升級到最新的 MassTransit,其實施方式如下:

// Program.cs
services.AddMassTransit(config =>
{
   config.AddConsumer<AppointmentBookedMessageConsumer, AppointmentBookedMessageConsumerDefinition>();
   config.UsingAzureServiceBus((context, cfg) => 
   {
      cfg.Host("Endpoint=sb://REDACTED-queues.servicebus.windows.net/;SharedAccessKeyName=MyMessageQueuing;SharedAccessKey=MyKeyGoesHere");
      cfg.Message<AppointmentBookedMessage>(m => m.SetEntityName("appointment-booked"));

      cfg.ConfigureEndpoints(context);
});


// AppointmentBookedMessageConsumerDefinition.cs
public class AppointmentBookedMessageConsumerDefinition: ConsumerDefinition<AppointmentBookedMessageConsumer>
{
   public AppointmentBookedMessageConsumerDefinition()
   {
      EndpointName = "testharness.subscriber";
   }

   protected override void ConfigureConsumer(IReceiveEndpointConfigurator endpointConfigurator, IConsumerConfigurator<AppointmentBookedMessageConsumer> consumerConfigurator)
   {
      endpointConfigurator.UseMessageRetry(r => r.Interval(5, TimeSpan.FromSeconds(60)));
   }
}

如果可以將其視為一個問題,則問題是我無法綁定到已經存在的訂閱。

在上面的示例中,您可以看到EndpointName設置為“testharness.subscriber”。 在我升級之前已經訂閱了“預約”主題。 但是,當應用程序運行時,它不會出錯,但不會收到任何消息。

如果我將EndpointName更改為“testharness.subscriber2”。 另一個訂閱者出現在 Azure 服務總線主題(通過 Azure 門戶)中,我開始接收消息。 我看不出名稱有什么不同(除了我放置的更改,在這種情況下:“2”后綴)。

我在這里錯過了什么嗎? 我還需要做些什么來讓這些綁定嗎? 我的配置錯了嗎? 是不是錯了? 雖然我確信我可以通過更密切地管理發布並在他們使用新的隊列時刪除不需要的隊列來解決這個問題 - 這感覺像是錯誤的方法。

使用 Azure 服務總線,訂閱上的ForwardTo可能有點不透明。

雖然訂閱可能確實在視覺上表明它正在轉發到正確命名的隊列,但可能是隊列在某些時候被刪除並重新創建,而沒有刪除訂閱。 這導致訂閱將建立消息,因為它無法將它們轉發到不再存在的隊列。

為什么? 在內部,訂閱將ForwardTo維護為object id ,在刪除隊列后指向不存在的 object - 導致消息在訂閱中累積。

如果您在訂閱中有消息,您可能需要將 go 進入門戶並更新該訂閱以指向新隊列(即使它具有相同的名稱),此時消息流向隊列。

如果訂閱中沒有任何消息(或者如果它們不重要),您可以刪除訂閱,當您重新啟動巴士時,MassTransit 將重新創建它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM