.net RabbitMQ点网客户端';s EventingBasicConsumer.Received不能同时触发多次?
我使用RabbitMQ.Client(我从NuGet获得)访问RabbitMQ。这是我的信息消费者代码:.net RabbitMQ点网客户端';s EventingBasicConsumer.Received不能同时触发多次?,.net,rabbitmq,.net,Rabbitmq,我使用RabbitMQ.Client(我从NuGet获得)访问RabbitMQ。这是我的信息消费者代码: const string EXCHANGE_NAME = "EXCHANGE3"; ConnectionFactory factory = new ConnectionFactory(); using (IConnection connection = factory.CreateConnection()) { usin
const string EXCHANGE_NAME = "EXCHANGE3";
ConnectionFactory factory = new ConnectionFactory();
using (IConnection connection = factory.CreateConnection()) {
using (IModel channel = connection.CreateModel()) {
channel.ExchangeDeclare(EXCHANGE_NAME, ExchangeType.Topic, false, true, null);
string queueName = channel.QueueDeclare();
channel.BasicQos(0, 4, false); //I want to handle 4 messages simultaneously
EventingBasicConsumer consumer = new EventingBasicConsumer(channel);
consumer.Received += (o, e) => {
string data = Encoding.ASCII.GetString(e.Body);
Console.WriteLine("received: " + data);
Thread.Sleep(1000);
Console.WriteLine("done."); //Received event will not be fired again before done.
};
string consumerTag = channel.BasicConsume(queueName, true, consumer);
channel.QueueBind(queueName, EXCHANGE_NAME, "myTopic");
Console.WriteLine("Listening press ENTER to quit");
Console.ReadLine();
channel.QueueUnbind(queueName, EXCHANGE_NAME, "myTopic", null);
}
}
它几乎是从RabbitMQ的官方教程中复制的。请注意,我使用了Sleep方法来模拟长时间任务,并且我发现接收到的事件不能同时触发。换句话说,我只能一个接一个地处理消息,这不是我想要的。我怎样才能使它正确呢?我们的解决方案基本上是:
consumer.Received += (o,e) => {
// setup...
Task.Factory.StartNew(() =>
{
// real work done here
});
};
也就是说,使用者启动新线程/任务(达到一定限制)。为了简单起见,我省略了任务计数限制逻辑等。您找到解决方案了吗?