我有一个Node.js服务器 - 我希望该进程能够监听自己发送的消息 - 这仅用于测试。我遇到的问题是,当向同一进程发布消息时,订阅者似乎根本不接收它。
我有这个设置:
var redis = require('redis');
var rcPub = redis.createClient();
var rcSub = redis.createClient();
var message = String('testing123');
rcSub.subscribe('redis_channel@test_overall_health');
rcSub.on('message', function (channel, msgs) {
console.log(channel,msgs);
});
rcPub.publish('redis_channel@test_overall_health', message);
我有一个redis客户端充当订阅者,一个充当发布者,这是您必须这样做的方式,但由于某种原因,消息未被接收。流程是否存在一些限制,无法收听它发布的消息?它似乎没有意义。我可以验证这段代码或多或少是正确的,因为收听同一频道的其他进程收到了消息。
答案 0 :(得分:3)
显然,在SUBSCRIBE
命令之后发送PUBLISH
命令。
Node的Redis客户端将命令排队,直到与Redis服务器建立连接,并在套接字上收到connect
事件时将排队的命令刷新到服务器。首先发起连接的客户端(发布者)很可能首先接收connect
事件,此时它将发送其排队的命令(发布)。由于Redis在单个线程中处理命令,因此仅在SUBSCRIBE
命令完成后才对订户PUBLISH
进行处理。其他进程能够接收消息,因为他们已经订阅了此频道。
首先创建订阅者客户端应该在大多数情况下都有效,尽管更安全的方法是在发布任何消息之前等待订阅完成:
var redis = require('redis');
var publisher = redis.createClient(),
subscriber = redis.createClient(),
message = 'testing123';
subscriber.subscribe('redis_channel@test_overall_health');
subscriber.on('message', function (channel, message) {
console.log(channel, message);
});
subscriber.on('subscribe', function (channel, count) {
publisher.publish('redis_channel@test_overall_health', message);
});