发布子模式在具有Rebus的Azure Service Bus上创建队列和主题

时间:2019-04-24 16:10:06

标签: rebus rebus-azureservicebus

调整以下应用程序以与Azure Service Bus一起使用。 https://github.com/rebus-org/RebusSamples/tree/master/PubSub

但是,下面创建了。

队列

错误

发布者

订户

主题

messages_datetimemessage__messages:订户

messages_stringmessage__messages:订户

messages_timespanmessage__messages:订户

我的问题

这是正确的吗?

是否可以减少所创建工件的数量?例如,请减少为一个主题,因为该主题用于pub sub。

更新

如果可能,我需要将Pub子模式与一个Topic和一个或两个订阅一起使用。

但是,下面有一个错误:

  

System.AggregateException HResult = 0x80131500 Message =一个或多个   发生错误。 (无法发布到主题“订单”)
  来源= System.Private.CoreLib StackTrace:at   System.Threading.Tasks.Task.Wait(Int32毫秒超时,   的CancellationToken cancelToken()   System.Threading.Tasks.Task.Wait()位于Publisher.Program.Main()中   C:_MyLab \ ReBus \ PubSub \ Publisher \ Program.cs:第43行

     

内部异常1:RebusApplicationException:无法发布到   主题“订单”

     

内部异常2:InvalidOperationException:无法打开主题   实体类型队列的客户端。   TrackingId:5c380af2-ad8f-4788-85b8-5427dd7873e4_B4,   SystemTracker:myapp:队列:订单,时间戳:2019-04-29T22:31:57   TrackingId:9c3e0c40-4410-4102-a705-86a6528cd030_B4,   SystemTracker:myapp:队列:订单,时间戳:2019-04-29T22:31:57   TrackingId:401a15d284ad44989f5e451c963d81e5_G16,   SystemTracker:gateway7,时间戳:2019-04-29T22:31:57

UseAzureServiceBus似乎是错误的,因为它正在使用队列

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);
        }
    }

上面的代码创建一个Order队列,这不是我想要的。

我想要一个主题,以及一个或两个订阅。

1 个答案:

答案 0 :(得分:0)

Rebus几乎鼓励您使用.NET类型作为主题,在这种情况下,这意味着主题

  • messages_datetimemessage__messages
  • messages_stringmessage__messages
  • messages_timespanmessage__messages

被创建,因为您发布了DateTimeMessageStringMessageTimeSpanMessage类型的事件(所有事件都驻留在Messages程序集的Messages名称空间中)

如果这不是您想要的,Rebus允许您像这样发布自定义主题:

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

在这种情况下将导致创建单个主题:my-topic

订户将需要进行相应的订阅:

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

请记住,没有过滤发布到某个主题的事件的类型,因此上面的订阅者将收到发布到my-topic主题的任何内容,无论它是否能够处理它。