Несколько подписчиков на одно и то же сообщение Rebus Azure Service Bus - PullRequest
1 голос
/ 25 марта 2020

У меня два абсолютно одинаковых потребителя

Потребитель 1

using (var adapter = new BuiltinHandlerActivator())
        {
            adapter.Handle<string>(async (bus, message) =>
            {
                Console.WriteLine("Got message > " + message);

                await bus.Reply("Received in consumer 1");
            });

            Configure.With(adapter)
                .Transport(t => t.UseAzureServiceBus(connectionString, "server"))
                .Start();

            adapter.Bus.Subscribe<string>().Wait();

            Console.WriteLine("Press ENTER to quit");
            Console.ReadLine();
        }

Потребитель 2

using (var adapter = new BuiltinHandlerActivator())
        {
            adapter.Handle<string>(async (bus, message) =>
            {
                Console.WriteLine("Got message > " + message);

                await bus.Reply("Received in Consumer 2");
            });

            Configure.With(adapter)
                .Transport(t => t.UseAzureServiceBus(connectionString, "server"))
                .Start();

            adapter.Bus.Subscribe<string>().Wait();

            Console.WriteLine("Press ENTER to quit");
            Console.ReadLine();
        }

Производитель

using (var adapter = new BuiltinHandlerActivator())
        {
            adapter.Handle<string>(async message =>
            {
                Console.WriteLine("Returned > " + message);
            });

            var bus = Configure
                .With(adapter)
                .Transport(t => t.UseAzureServiceBus(connectionString, "client"))
                .Routing(r => r.TypeBased().Map<string>("server"))
                .Start();

            Console.WriteLine("Press Q to quit or any other key to produce a job");
            while (true)
            {
                Console.Write("Write something > ");
                var text = Console.ReadLine();

                if (string.IsNullOrWhiteSpace(text)) break;

                bus.Publish(text).Wait();
            }
        }

Что я ожидаю каждый раз, когда я отправляю сообщение от источника, оба моих потребителя отображают сообщение. Теперь он делает это только в одном из них. Когда я закрываю это и отправляю другое сообщение, остальное получает его.

1 Ответ

2 голосов
/ 25 марта 2020

По сути, вам нужно всего лишь дать потребителю разные имена. Rebus создает топи c для каждого производителя (на основе сборки, пространства имен, типа) и создает подписки для каждого потребителя в этих темах. Если два потребителя используют одно и то же имя, они борются за сообщение.

                .Transport(t => t.UseAzureServiceBus(connectionString, "consumer1"))
                .Transport(t => t.UseAzureServiceBus(connectionString, "consumer2"))

Полный пример: https://github.com/rebus-org/RebusSamples/tree/master/PubSubNative

Некоторые другие полезные ссылки:

...