C# 如何在EasynetQ中通过队列名称使用自动订阅机制?

C# 如何在EasynetQ中通过队列名称使用自动订阅机制?,c#,rabbitmq,easynetq,C#,Rabbitmq,Easynetq,这是我的出版商。有两个消费者。邮件消费者和短信消费者 using(var bus = RabbitHutch.CreateBus("host=localhost").Advanced) { var queueName = "my.queue"; var queueName2 = "my.queue2"; var queue = bus.QueueDeclare(queueName); var que

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

 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中没有队列名称选项,有订阅Id,AutoSubscriber上有一个名为“GenerateSubscriptionId”的属性,您可以将其设置为为为使用者生成订阅Id:

subscriber.GenerateSubscriptionId = subscriptionInfo =>
{
  return "MyApplication:" + subscriptionInfo.ConcreteType.Name);
};
然后,默认约定将使用订阅id生成队列名称

更新: 我认为,你可以实现你想要的只是与普通酒吧酒吧,而不声明任何队列

在publisher中,您可以执行以下操作:

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

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

它不起作用。。来自文档:如果您使用不同的订阅ID但相同的消息类型调用Subscribe两次,您将创建两个队列,每个队列都有自己的使用者。给定类型的每条消息的副本将路由到每个队列,因此每个使用者将获得该类型的所有消息。如果您有多个不同的服务都关心相同的消息类型,这将非常好。所以我们不需要扇出交换?你能发送一个包含发行商和订户代码的工作代码吗?我不是100%,你为什么要打两次电话?要在使用者启动之前确保队列存在?我不想调用它两次。认为你有错误日志。您需要向技术部门发送电子邮件,并将错误日志写入ElastichSearch数据库。您可以创建一条消息,通过扇出将其发布到两个单独的队列,并单独使用队列。情况就是这样。在我的问题中,我已经发送了工作示例。那么,我如何通过自动订阅的方式实现它呢?谢谢。见更新。您不需要声明队列,您可以直接在总线上发布消息,如果消费者启动过,两个队列都会收到消息。@ozz这对您有用吗,或者我没有完全理解您的问题?
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()