同一消息的多个订阅者Rebus Azure服务总线

同一消息的多个订阅者Rebus Azure服务总线,azure,service,subscription,rebus,bus,Azure,Service,Subscription,Rebus,Bus,我有两个完全相同的消费者 消费者1 using (var adapter = new BuiltinHandlerActivator()) { adapter.Handle<string>(async (bus, message) => { Console.WriteLine("Got message > " + message); await

我有两个完全相同的消费者

消费者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();
        }
使用(var适配器=新的内置HandlerActivator())
{
adapter.Handle(异步(总线、消息)=>
{
Console.WriteLine(“获取消息>”+消息);
等待回复(“在消费者1中收到”);
});
配置.With(适配器)
.Transport(t=>t.UseAzureServiceBus(连接字符串,“服务器”))
.Start();
适配器.Bus.Subscribe().Wait();
Console.WriteLine(“按ENTER键退出”);
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();
        }
使用(var适配器=新的内置HandlerActivator())
{
adapter.Handle(异步(总线、消息)=>
{
Console.WriteLine(“获取消息>”+消息);
等待回复(“在消费者2中收到”);
});
配置.With(适配器)
.Transport(t=>t.UseAzureServiceBus(连接字符串,“服务器”))
.Start();
适配器.Bus.Subscribe().Wait();
Console.WriteLine(“按ENTER键退出”);
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();
            }
        }
使用(var适配器=新的内置HandlerActivator())
{
adapter.Handle(异步消息=>
{
Console.WriteLine(“返回>”+消息);
});
var总线=配置
.带(适配器)
.Transport(t=>t.UseAzureServiceBus(connectionString,“客户端”))
.Routing(r=>r.TypeBased().Map(“服务器”))
.Start();
Console.WriteLine(“按Q键退出或按任何其他键生成作业”);
while(true)
{
控制台。写(“写东西>”;
var text=Console.ReadLine();
if(string.IsNullOrWhiteSpace(text))中断;
bus.Publish(text.Wait();
}
}
我所期望的是,每当我从制作人那里发送消息时,我的两个消费者都会显示消息。
现在,它只在其中一个中起作用。当我关闭这一个并发送另一条消息时,其余的一个会收到它。

基本上,你只需要给消费者不同的名字。Rebus为每个生产者创建一个主题(基于程序集、命名空间、类型),并为这些主题中的每个使用者创建订阅。 如果两个消费者使用相同的名称,他们将竞争该消息

                .Transport(t => t.UseAzureServiceBus(connectionString, "consumer1"))
                .Transport(t => t.UseAzureServiceBus(connectionString, "consumer2"))
完整示例:

其他一些有用的链接:


谢谢,这很有效,但我很困惑。第二个参数是
inputQueueAddress
,我认为它必须是相同的(例如服务器),以便消息到达那里。现在,我正在测试每个类中该参数的不同字符串值。现在两个消费者都使用所有字符串消息。基本上,我玩的是1个生产者-2个消费者(发送1条消息并在消费者中接收),这现在起作用了。现在我想尝试的是1个生产者发送1个字符串消息,但发送给给定的消费者。在这种情况下是否需要使用.Send()。很高兴能提供帮助。不过,你或许应该在一个新问题中提出这个问题。我不太清楚你的意思,如果你问一个新问题,就会有更多的人看到。