是否可以从即将关闭的ZMQ套接字获取数据

Is it possible to get data from a ZMQ socket, that is about to be closed?

本文关键字:ZMQ 套接字 获取 数据 是否      更新时间:2023-09-26

我需要实现ZMQ的一个位扩展,其中'REQ'套接字有一个名为".request()"的额外方法。

该方法可以接收多个参数,并且(这里我有问题)如果第一个参数是0.request( 0, ... )只发送消息,否则它必须等待10秒,如果此时我没有响应或错误,我必须.close()套接字并再次打开它。

所以,问题是:我如何知道在ZMQ的扩展中,客户端连接到哪里,以便能够重新连接那里我的新套接字?

(我也需要使用promise,这就是为什么代码中出现"Q.deffer()"以及所有这些内容)

var zmq = require('./pzmq');
var rq = zmq.socket('req');
var counter=0;
function onSuccess(msg) {
    console.log('Response: '+msg);
    console.log(msg instanceof Array);
}
function onError(err) {
    console.log('Error: '+err);
}
rq.connect('tcp://127.0.0.1:8888');
console.log(rq.indentity);
// The "Hello" string is sent every second
reply = rq.request(0, counter++,4);
reply.then(onSuccess,onError);

这里我有ZMQ的一个小扩展,叫做pzmq

var zmq = require('zmq');
var Q = require('bluebird');
// Save the original socket method, we need it
var socket = zmq.socket;
// Create and store the wrapper method
zmq.socket = function(kind) {
    // it uses the original method anyways, to get a zmq socket
    var so = socket.call(zmq, kind);
    if (kind == 'req') {
        // if a 'req' socket is requested, then we add the extra method 2
        so.request = request;
    }
    return so;
};

function request() {
    var d = Q.defer();
    var that = this; 
    var onResponse = function () {
        console.log(arguments instanceof Array);
        d.resolve(Array.prototype.slice.call(arguments)); 
        that.removeListener('error', onError);  
    };
    var onError = function (e) {
        d.reject(e);
        that.removeListener('message', onResponse); 
    };
    this.once('message', onResponse); // set up the handler for only one message
    this.once('error', onError);      // set up the handler for only one
    var argumentos = Array.prototype.slice.call(arguments);
    var tiempo = argumentos[0];
    if (tiempo==0){
        this.send(argumentos);
    }else{
        //HERE IS THE PROBLEM
    }
    return d.promise;
}

缩写:否

龙:是的

ZeroMQ库允许您设置可扩展的消息传递框架,根据您的需求进行设计。灵活性是准则,你的设计和想象力的界限是主要的限制。

如果你需要.close()/重新打开一个ZMQ套接字,你的应用程序应该创建它自己的、状态完整的连接管理器,它是可感知的&负责传输类设置、连接寻址、原型选择,最后但并非最不重要的是,.connect()/.bind()/ev.re-subscribe阶段的适当定时。

听起来好像很复杂?是的,尽管如此,还是没有"廉价的捷径"。底层库方法&属性根本无法"猜测"您的外部世界规则和优先级,因此轮到您指定+分析+设计+测试/验证应用程序层上的强制性功能/行为。

ZMQ将帮助您执行"休息"。