![](/img/trans.png)
[英]EasyNetQ Windows Service messaging architecture not quite working
[英]EasyNetQ with Windows Service Exception
我一直在运行带有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();
我认为您订阅的方式有误。 对于同一个队列, 您不应 _bus.Receive(queueName)
调用 _bus.Receive(queueName)
(来自EasyNETQ文档):
注意:您可能不想呼叫bus.for同一队列接收多次。 这将在队列上创建一个新的使用者,RabbitMQ将在它们之间循环。 如果您在不同的Receive调用上使用不同的类型(从而在不同的使用者)上使用,则某些消息将最终出现在错误队列中,因为EasyNetQ将找不到与使用该消息的使用者相关的消息类型的处理程序。
只需执行一次,您的消费者(每种类型)就会被注册。
这是特别正确的,因为您似乎正在使用发布者确认 。 我不太了解您的方案,但是除非您具有事务性RPC调用模型,否则通常不需要这样做。
检查发布者上的文档是否确认 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.