nodejs mongodb monq

nodejs和mongodb一起使用是很常见的场景。

有时候,mongodb甚至可以通过monq这个模块,将mongodb挂载成一个que的服务。

https://github.com/scttnlsn/monq

  • 安装monq npm包 
npm install -s monq

  • taskq工具类 tasq.js
/**
* Tasks Queue Management working with monq
*/

var jf = require("jsonfile")
var path = require("path")
var monq = require("monq")
var u = require("util")
var client, tq
var dbUrl = require("../../persistence/database").url
var log = require("../../util/loggerUtil").getLogger("replicator")
var que
var master = require("./master")

/**
 * set Queue Connection Info
 */
function init(){
    log.debug(u.format("monq connects ... %s",dbUrl))
    client = monq(dbUrl, {safe: true});
    tq = client.queue("taskq")
}

/**
 * publish jobName
 * @param message {topic:"", body:""}
 */
function pub(message,callback){
    if(tq !== undefined){
        tq.enqueue(message.topic,message.body,function(err,job){
            if(typeof(callback) === 'function'){
                callback(err,job)
            }
        })
    }
}

/**
 * consume jobs in que
 */
function start(){
    if(tq === undefined){
        init()
    }
    que = client.worker(['taskq']);
    que.register({
        workloads: master.partition
    });
    que.on('dequeued', function(data) {
        log.debug('taskq>> Dequeued:'+ data._id);
    });

    que.on('failed', function(data) {
        log.debug('taskq>> Failed:'+ data._id);
    });

    que.on('complete', function(data) {
        log.debug('taskq>> Complete:'+ data._id);
    });

    que.on('error', function(err) {
        log.debug('Error:');
        log.debug(err);
    });
    que.start();
}

/**
 * stop que
 */
function stop(){
    if(que !== null){
        que.stop()
    }
}

module.exports.pub = pub
module.exports.start = start
module.exports.stop = stop


  • 消息发布 master.js
        // publish workloads out
        var t = { topic: "workloads",
                  body : { workerId : workerId,
                           shape: JSON.stringify(shape)}
                }
        taskq.pub(t,function(err,job){
            if(err){
                throw new Error("can not publish workloads to taskq")
            }
        })

  • 消息订阅 master.js
/**
 * listen taskq messages
 */
function partition(params,callback){
    try{
        log.debug(u.format("master>> create worker: %s",params.workerId))
        var shape = JSON.parse(params.shape)
        setWorker(shape)
        callback(null,params)
    }catch(e){
        log.debug(e)
        callback(e,params)
    }
}


发布了386 篇原创文章 · 获赞 19 · 访问量 82万+

猜你喜欢

转载自blog.csdn.net/watson243671/article/details/19407127
今日推荐