Подзаголовок паба создает очереди и темы в служебной шине Azure с Rebus - PullRequest
0 голосов
/ 24 апреля 2019

Приложение, приведенное ниже, настроено для работы с служебной шиной Azure.https://github.com/rebus-org/RebusSamples/tree/master/PubSub

Однако ниже созданы.

Очереди

Ошибка

Издатель

Подписчик

Темы

messages_datetimemessage__messages: подписчик

messages_stringmessage__messages: подписчик

messages_timespanmessage__messages: subscriber

Мой вопрос

это правильно?

И можно ли уменьшить количество создаваемых артефактов?Например, уменьшите только до одной темы, потому что тема используется для публикации sub.

Обновление

Мне нужно использовать шаблон публикации Pub с одной темой и одной или двумяподписки, если это возможно.

Однако ниже приведена ошибка:

System.AggregateException HResult = 0x80131500 Сообщение = Произошла одна или несколько ошибок.(Невозможно опубликовать в теме 'order')
Source = System.Private.CoreLib StackTrace: at System.Threading.Tasks.Task.Wait (Int32 миллисекундTimeout, CancellationToken cancellationToken) в System.Threading.Tasks.Task.Wait () в Publisher.Program.Main () в C: _MyLab \ ReBus \ PubSub \ Publisher \ Program.cs: строка 43

Внутреннее исключение 1: RebusApplicationException: Не удалось опубликовать в теме 'order'

Внутреннее исключение 2: InvalidOperationException: Невозможно открыть клиент Темы для очереди типа объекта.Идентификатор отслеживания: 5c380af2-ad8f-4788-85b8-5427dd7873e4_B4, SystemTracker: myapp: Очередь: заказ, метка времени: 2019-04-29T22: 31: 57 Идентификатор отслеживания: 9c3e0c40-4410-4102-a705-86a6528cd030_Bue: заказ системы: Трасса, Метка времени: 2019-04-29T22: 31: 57 TrackingId: 401a15d284ad44989f5e451c963d81e5_G16, SystemTracker: gateway7, метка времени: 2019-04-29T22: 31: 57

UseAzureServiceBus кажется неправильным, поскольку он используетqueue

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.Order))                   
                    .Start();

                 activator.Bus.Advanced.Topics.Publish(Consts.Order, new StringMessage("Hello there, I'm a publisher!")).Wait();

            }

            }

UseAzureServiceBus кажется неправильным, потому что использует очередь.Может ли обработчик обрабатывать сообщения?

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.Order))
                    .Routing(r => r.TypeBased().MapAssemblyOf<StringMessage>(Consts.Order))
                    .Start();

                activator.Bus.Advanced.Topics.Subscribe(Consts.Order);

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

    class Handler : IHandleMessages<StringMessage>, IHandleMessages<DateTimeMessage>, IHandleMessages<TimeSpanMessage>
    {
        public async Task Handle(StringMessage message)
        {
            Console.WriteLine("Got string: {0}", message.Text);
        }

        public async Task Handle(DateTimeMessage message)
        {
            Console.WriteLine("Got DateTime: {0}", message.DateTime);
        }

        public async Task Handle(TimeSpanMessage message)
        {
            Console.WriteLine("Got TimeSpan: {0}", message.TimeSpan);
        }
    }

Приведенный выше код создает очередь заказов, а это не то, что мне нужно.

Я хочу тему и одну или две подписки.

1 Ответ

0 голосов
/ 24 апреля 2019

Rebus в значительной степени поощряет использование типов .NET в качестве тем, что в данном случае означает, что темы

  • messages_datetimemessage__messages
  • messages_stringmessage__messages
  • messages_timespanmessage__messages

создается, потому что вы публикуете события типов DateTimeMessage, StringMessage и TimeSpanMessage (все они находятся в пространстве имен Messages в сборке Messages).

Если это не то, что вам нужно, Rebus позволяет публиковать в пользовательских темах, например, так:

await bus.Advanced.Publish("my-topic", new DateTimeMessage(...))`;

, что в этом случае приведет к созданию одной темы: my-topic.

Подписчик (подписчики) должен будет соответственно подписаться:

await bus.Advanced.Subscribe("my-topic");

Имейте в виду, что нет фильтрации типов событий, опубликованных в теме, поэтому подписчик вышеполучит все, что опубликовано в теме my-topic, независимо от того, сможет ли оно с этим справиться.

...