我一直在使用EasyNetQ运行一个简单的Windows服务, 但是当我尝试发布消息时,我一直在收到异常。
例外:
的 Pubisher confirms timed out after 10 seconds waiting for ACK or NACK from sequence
的
以下是我的发布测试:
try {
var queue = _bus.Advanced.QueueDeclare("api-request-history");
_bus.Send(queue.Name, message);
} catch (Exception e) {
Logger.FatalException(string.Format("Message were not queued in queue: {0}", queue.Name), e);
OnErrorOccurred(e);
}
以下是我的订阅测试:
public override void Subscribe(Action<IReceiveRegistration> execution) {
var queue = _bus.Advanced.QueueDeclare("api-request-history");
try {
while (_bus.IsConnected) {
_bus.Receive(queue.Name, execution);
}
} catch (Exception e) {
Logger.ErrorException("Error occurred", e);
} finally {
if (_bus != null) {
_bus.Dispose();
}
}
}
以下是订阅的邀请:
_queueConsumer.Subscribe(x => x.Add<ApiRequestHistory>(message => {
Logger.Info("Initializing subscribtion sequence!");
Logger.Info("Message data is being saved...");
Execute();
Logger.Info("Message data saving is completed!");
Thread.Sleep(100);
wait.Set();
}));
wait.Wait();
答案 0 :(得分:0)
我认为你订的方式不对。对于相同的队列(来自EasyNETQ文档),You shouldn't be calling _bus.Receive(queueName)
不止一次:
注意:您可能不希望为同一个队列调用bus.Receive多次。这将在队列中创建一个新的使用者,RabbitMQ将在它们之间循环。如果您在不同的接收呼叫(以及不同的消费者)上使用不同的类型,您的一些消息将最终出现在错误队列中,因为EasyNetQ将找不到与消费者使用的消费者相关联的消息类型的处理程序。 / em>的
只需执行一次即可注册您的消费者(每种类型)。
这是特别正确的,因为您似乎正在使用发布商确认。我完全不了解您的场景,但通常不需要,除非您有事务性RPC调用模型。
检查发布商确认<{em>上的docs。