如何在EasynetQ中通过队列名称使用AutoSubscribe机制?

时间:2015-03-22 20:16:51

标签: c# rabbitmq easynetq

这是我的出版商。有两个消费者。 MailConsumer和SmsConsumer。

 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选项,有&#34; Subscription Id&#34;

1 个答案:

答案 0 :(得分:0)

AutoSubscriber上有一个名为&#39; GenerateSubscriptionId&#39;的属性,您可以将其设置为为消费者生成订阅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类位于两个项目共享的程序集中。