我正在使用node-amqp连接到 RabbitMQ。设置如下:
- 两台 RabbitMQ 服务器(以下称为“兔子”),一台称为“传入”,另一台称为“通知程序”。
- 数据发布到“传入”兔子,我的应用程序缓冲(“缓冲区”应用程序)一定数量的消息,然后再将它们写入数据库。
- 然后缓冲区尝试将这些消息发布到“通知程序”兔子,该兔子旨在通知系统的其他部分(如 UI)。
从“传入”中提取消息很好,并且写入数据库等一切正常,但是在发布到“通知程序”时,我在尝试发布前几条消息后收到以下错误:
Unhandled connection error: UNEXPECTED_FRAME - expected content header for class 60, got non content header frame instead
连接如下所示:
self.exchangeOpen = new Promise(function(resolve) {
var exchangeOptions = {
type: 'fanout',
autoDelete: false,
confirm: true
};
conn.exchange(opts.exchange, exchangeOptions, function(exchange) {
debug('exchange %s opened', opts.exchange);
self.exchange = exchange;
resolve(exchange);
});
});
(我确实看到了交换打开的消息,所以它确实成功地打开了它。)
然后,我将按如下方式发布到此交易所:
publish: function(data) {
var self = this;
debug('publishing data');
return new Promise(function(resolve) {
self.exchange.publish('', data, { contentType: 'application/json' }, function() {
debug('data published!');
resolve(data);
});
});
}
一旦数据写入数据库,这将在循环中调用。
这个错误只弹出一次,但是当我查看 RabbitMQ 管理界面时,根本没有消息发布到队列中。我尝试将队列类型从更改为fanout
,topic
但无济于事。此外,该confirm: true
标志似乎什么都不做,因为从不调用确认回调。这意味着在发布新消息之前我不能等待消息确认。
我无法弄清楚问题是什么,因为错误消息有点神秘。这可能与尝试(几乎)同时发布许多东西有关,但如果没有确认回调,我无法阻止这种情况发生......