【问题标题】:Pub sub pattern with centralized subscription storage using Azure Service Bus使用 Azure 服务总线进行集中订阅存储的发布子模式
【发布时间】:2019-04-24 15:04:54
【问题描述】:

我是 Rebus 的新手,并尝试使用 Azure 服务总线运行以下应用程序,但出现以下错误: https://github.com/rebus-org/RebusSamples/tree/master/PubSubCentralized

System.InvalidOperationException
  HResult=0x80131509
  Message=Attempted to register primary -> Rebus.Subscriptions.ISubscriptionStorage, but a primary registration already exists: primary -> Rebus.Subscriptions.ISubscriptionStorage (The Azure Service Bus transport was inserted as the subscriptions storage because it has native support for pub/sub messaging)
  Source=Rebus
  StackTrace:
   at Rebus.Injection.Injectionist.Register[TService](Func`2 resolverMethod, Boolean isDecorator, String description)
   at Rebus.Injection.Injectionist.Register[TService](Func`2 resolverMethod, String description)
   at Publisher.Program.<>c.<Main>b__2_2(StandardConfigurer`1 s) in C:\ReBus\PubSub\Publisher\Program.cs:line 26
   at Rebus.Config.RebusConfigurer.Subscriptions(Action`1 configurer)
   at Publisher.Program.Main() in C:\ReBus\PubSub\Publisher\Program.cs:line 22

我的问题是,由于不支持订阅,我怎样才能使它工作?

 class Subscriber
    {
        static void Main()
        {
            using (var activator = new BuiltinHandlerActivator())
            {
                activator.Register(() => new Handler());

                Configure.With(activator)
                    .Logging(l => l.ColoredConsole(minLevel: LogLevel.Warn))                                 
                    .Transport(t => t.UseAzureServiceBus(Consts.ServiceBusConnectionString, Consts.Subscriber))
                   // .Subscriptions(s => s.StoreInSqlServer("server=.; database=RebusPubSubCentralized; trusted_connection=true", "Subscriptions", isCentralized: true))
                    .Start();

                activator.Bus.Subscribe<StringMessage>().Wait();
                activator.Bus.Subscribe<DateTimeMessage>().Wait();
                activator.Bus.Subscribe<TimeSpanMessage>().Wait();

                Console.WriteLine("This is Subscriber 1");
                Console.WriteLine("Press ENTER to quit");
                Console.ReadLine();
                Console.WriteLine("Quitting...");
            }
        }
    }




class Publisher
    {
        static void Main()
        {
            using (var activator = new BuiltinHandlerActivator())
            {
                Configure.With(activator)
                    .Logging(l => l.ColoredConsole(minLevel: LogLevel.Warn))
                    .Transport(t => t.UseAzureServiceBus(Consts.ServiceBusConnectionString, Consts.Publisher))                 
                    //.Subscriptions(s => s.StoreInSqlServer("server=.; database=RebusPubSubCentralized; trusted_connection=true", "Subscriptions", isCentralized: true))
                    .Start();

                var startupTime = DateTime.Now;

                var keyChar = char.ToLower(Console.ReadKey(true).KeyChar);
                var bus = activator.Bus.Advanced.SyncBus;
                bus.Publish(new TimeSpanMessage(DateTime.Now - startupTime));                    

                Console.WriteLine("Quitting!");
            }
        }
    }   

【问题讨论】:

    标签: rebus rebus-azureservicebus


    【解决方案1】:

    使用 Azure 服务总线,无需注册订阅存储,因为它本机支持发布/订阅。

    这意味着您可以安全地注释掉

    .Subscriptions(s => ...)
    

    事情,然后一切都会好起来的。

    【讨论】:

    • 这是否意味着在示例上,Azure Service Bus 的 PubSubCentralized 和 PubSub 都相同?
    • 是的!使用 Azure 服务总线,订阅始终是“集中式的”,因为服务总线实例(通过其主题)会跟踪订阅。
    • @mookid8000,Amazon SQS 怎么样 - 我们需要订阅吗? github.com/rebus-org/Rebus/wiki/ISubscriptionStorage 未提及 Amazon SQS
    • Amazon SQS 没有提供基于主题的消息副本分发的内置方式,因此在这种情况下,您需要配置 Rebus 以通过配置订阅存储来“填充”该功能.
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-02-26
    • 1970-01-01
    • 2020-10-08
    • 2021-09-23
    • 1970-01-01
    • 2016-05-09
    • 1970-01-01
    相关资源
    最近更新 更多