Windows 服务上的 RabbitMQ 多个唯一消费者
RabbitMQ Multiple Unique Consumers on Windows Service
我搜索了 Whosebug,但我认为围绕多个消费者的其他问题与我正在尝试的不相符。
我有一个 Windows 服务启动并注册以监视 两个不同的 RabbitMQ 队列。如果我只注册它来收听 1 个队列,它就可以正常工作。当我试图让它监听两个队列时,只有第二个监听器工作。
var responseConsumer = new EventingBasicConsumer(_responseChannel);
responseConsumer.Received += (model, ea) =>
{
var message = Encoding.UTF8.GetString(ea.Body);
// PROCESS MESSAGE
IssuerProcessor processor = new IssuerProcessor("Processed Message(" + pause + "ms) : ");
Thread.Sleep(pause);
var ret = processor.ProcessResponseMessage();
Console.WriteLine("Processed message: " + ret);
ulong deliveryTag = ea.DeliveryTag;
_responseChannel.BasicAck(deliveryTag, false);
Console.WriteLine("ACK RESPONSE Delivery Tag (" + deliveryTag.ToString() + "): " + ret);
}; // end requestConsumer.Received
_responseChannel.BasicConsume(queue: RESPONSE_QUEUE, autoAck: autoAck, consumer: responseConsumer);
另一个消费者看起来就像这个消费者,但它使用相同的连接,使用不同的通道侦听不同的队列。
这是两者的初始化:
_requestChannel = _connection.CreateModel();
_responseChannel = _connection.CreateModel();
_requestChannel.ExchangeDeclare(EXCHANGE, ExchangeType.Direct, true, false, null);
_requestChannel.QueueDeclare(queue: REQUEST_QUEUE, durable: true, exclusive: false, autoDelete: false, arguments: null);
_requestChannel.BasicQos(0, 1, false);
_requestChannel.QueueBind(REQUEST_QUEUE, EXCHANGE, REQUEST_QUEUE, null);
_responseChannel.ExchangeDeclare(EXCHANGE, ExchangeType.Direct, true, false, null);
_responseChannel.QueueDeclare(RESPONSE_QUEUE, durable: true, exclusive: false, autoDelete: false, arguments: null);
_responseChannel.BasicQos(0, 1, false);
_responseChannel.QueueBind(RESPONSE_QUEUE, EXCHANGE, RESPONSE_QUEUE, null);
问题最终是服务 运行 在单个线程上,它无法同时监视两个队列。
我刚刚创建了两个不同的线程,并在不同的线程上启动了每个消费者。
public void StartWorkerThreads()
{
Thread receivingConsumerThread = new Thread(StartListenReceivingQueue);
receivingConsumerThread.Start();
Thread respondingConsumerThread = new Thread(StartListenRespondingQueue);
respondingConsumerThread.Start();
}
我搜索了 Whosebug,但我认为围绕多个消费者的其他问题与我正在尝试的不相符。
我有一个 Windows 服务启动并注册以监视 两个不同的 RabbitMQ 队列。如果我只注册它来收听 1 个队列,它就可以正常工作。当我试图让它监听两个队列时,只有第二个监听器工作。
var responseConsumer = new EventingBasicConsumer(_responseChannel);
responseConsumer.Received += (model, ea) =>
{
var message = Encoding.UTF8.GetString(ea.Body);
// PROCESS MESSAGE
IssuerProcessor processor = new IssuerProcessor("Processed Message(" + pause + "ms) : ");
Thread.Sleep(pause);
var ret = processor.ProcessResponseMessage();
Console.WriteLine("Processed message: " + ret);
ulong deliveryTag = ea.DeliveryTag;
_responseChannel.BasicAck(deliveryTag, false);
Console.WriteLine("ACK RESPONSE Delivery Tag (" + deliveryTag.ToString() + "): " + ret);
}; // end requestConsumer.Received
_responseChannel.BasicConsume(queue: RESPONSE_QUEUE, autoAck: autoAck, consumer: responseConsumer);
另一个消费者看起来就像这个消费者,但它使用相同的连接,使用不同的通道侦听不同的队列。
这是两者的初始化:
_requestChannel = _connection.CreateModel();
_responseChannel = _connection.CreateModel();
_requestChannel.ExchangeDeclare(EXCHANGE, ExchangeType.Direct, true, false, null);
_requestChannel.QueueDeclare(queue: REQUEST_QUEUE, durable: true, exclusive: false, autoDelete: false, arguments: null);
_requestChannel.BasicQos(0, 1, false);
_requestChannel.QueueBind(REQUEST_QUEUE, EXCHANGE, REQUEST_QUEUE, null);
_responseChannel.ExchangeDeclare(EXCHANGE, ExchangeType.Direct, true, false, null);
_responseChannel.QueueDeclare(RESPONSE_QUEUE, durable: true, exclusive: false, autoDelete: false, arguments: null);
_responseChannel.BasicQos(0, 1, false);
_responseChannel.QueueBind(RESPONSE_QUEUE, EXCHANGE, RESPONSE_QUEUE, null);
问题最终是服务 运行 在单个线程上,它无法同时监视两个队列。
我刚刚创建了两个不同的线程,并在不同的线程上启动了每个消费者。
public void StartWorkerThreads()
{
Thread receivingConsumerThread = new Thread(StartListenReceivingQueue);
receivingConsumerThread.Start();
Thread respondingConsumerThread = new Thread(StartListenRespondingQueue);
respondingConsumerThread.Start();
}