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)
}
}