【问题标题】:Pub sub pattern created Queues and Topics on Azure Service Bus with Rebus发布子模式使用 Rebus 在 Azure 服务总线上创建队列和主题
【发布时间】:2019-09-14 00:08:56
【问题描述】:

以下应用经过调整,可与 Azure 服务总线一起使用。 https://github.com/rebus-org/RebusSamples/tree/master/PubSub

但是,下面是创建的。

队列

错误

出版商

订阅者

主题

messages_datetimemessage__messages:订阅者

messages_stringmessage__messages:订阅者

messages_timespanmessage__messages:订阅者

我的问题

这是正确的吗?

是否可以减少创建的工件数量?例如,减少到只有一个主题,因为主题用于发布订阅。

更新

如果可能的话,我需要使用带有一个主题和一两个订阅的 Pub 子模式。

但是,下面出现错误:

System.AggregateException HResult=0x80131500 消息=一个或多个 发生错误。 (无法发布到主题“订单”)
源 = System.Private.CoreLib StackTrace:在 System.Threading.Tasks.Task.Wait(Int32 毫秒超时, CancellationToken 取消令牌)在 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:Queue:order, 时间戳:2019-04-29T22:31:57 TrackingId:9c3e0c40-4410-4102-a705-86a6528cd030_B4, SystemTracker:myapp:Queue:order, 时间戳: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 似乎是错误的,因为它正在使用队列。 Handler能处理消息吗?

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

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

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

【问题讨论】:

    标签: rebus rebus-azureservicebus


    【解决方案1】:

    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 主题的任何内容,无论它是否能够处理它。

    【讨论】:

    • 我会在这里测试并更新。关于 ASB 的一个类似问题,是否可以在 Azure 而不是 Rebus 上设置根据不同订阅的标头过滤消息,而不是发送到所有订阅?
    • 它可能是。我似乎记得曾经在订阅中使用过“SQL 过滤器”或类似的东西。不过,我并不是特别喜欢这个想法,因为主题(至少在我看来)应该足以表达对消息的兴趣......但这只是我的意见?
    • Rebus for ASB Topic 上,Publish() 方法可以发布到主题,Subcriber 订阅订阅吗?从你给我看的代码来看,我的主题对我来说就像一个队列。
    • 在 Azure 服务总线术语中,await bus.Subscribe("my-topic") 将创建一个名为 my-topic 的主题,然后它将在该主题下创建一个订阅,将所有收到的消息转发到订阅者的输入队列。这样,消息总是从队列中接收。
    猜你喜欢
    • 2020-10-08
    • 1970-01-01
    • 2021-11-17
    • 1970-01-01
    • 2018-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多