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()