0

这是我的出版商。有两个消费者。邮件消费者和短信消费者。

 using(var bus = RabbitHutch.CreateBus("host=localhost").Advanced) {
            var queueName = "my.queue";
            var queueName2 = "my.queue2";
            var queue = bus.QueueDeclare(queueName);
            var queue2 = bus.QueueDeclare(queueName2);
            var channel = bus.ExchangeDeclare("MyFanout", ExchangeType.Fanout);
            bus.Bind(channel, queue, "sms");
            bus.Bind(channel, queue2, "mail");
            var input = "";
            Console.WriteLine("Enter a message. 'q' to quit.");
            while((input = Console.ReadLine()) != "q") {
                for(int i = 1; i < 2; i++) {
                    var message = new Message<TextMessage>(new TextMessage {
                        Text = input + i
                    });
                    bus.Publish(channel, "", false, false, message);
                }
            }
        }

我可以使用以下代码订阅:

using(var bus = RabbitHutch.CreateBus("host=localhost").Advanced) {
            var queueName = "my.queue2";
            var queue = bus.QueueDeclare(queueName);

            bus.Consume(queue, x => x.Add<TextMessage>((message, info) => {
                Thread.Sleep(1000);
                Console.WriteLine("SMS: {0}", message.Body.Text);
            }));

            Console.WriteLine("Listening for messages. Hit <return> to quit.");
            Console.ReadLine();
        }

如何通过 AutoSubscriber 实现它?AutoSubscriber 中没有 Queue Name 选项,有“Subscription Id”

4

1 回答 1

0

AutoSubscriber 上有一个名为“GenerateSubscriptionId”的属性,您可以设置它来为消费者生成订阅 ID:

subscriber.GenerateSubscriptionId = subscriptionInfo =>
{
  return "MyApplication:" + subscriptionInfo.ConcreteType.Name);
};

然后订阅 ID 将被默认约定用于生成队列名称。

更新: 我认为您只需使用普通的 pub-sub 即可实现您想要的,而无需声明任何队列。

在您的发布者中,您可以这样做:

var bus = RabbitHutch.CreateBus("host=localhost")
while((input = Console.ReadLine()) != "q") {
  for(int i = 1; i < 2; i++) {
    var message = new Message<TextMessage>(new TextMessage {
     Text = input + i
    });
    bus.Publish(message);
    }
 }

然后只需创建 2 个消费者来订阅您的消息,您的消息将由两者处理:

class SmsConsumer : IConsume<TextMessage>{
   ...
}

class LogConsumer : IConsume<TextMessage>{
   ...
}

在你的启动中:

var bus = RabbitHutch.CreateBus("host=localhost")
var subscriber = new AutoSubscriber(bus,"my_applications_subscriptionId_prefix");
subscriber.Subscribe(Assembly.GetExecutingAssembly());
Console.ReadLine()

EasyNetQ 将为您声明交换、队列和绑定。只需确保您的 TextMessage 类位于两个项目共享的程序集中。

于 2015-03-23T11:47:16.563 回答