大佬教程收集整理的这篇文章主要介绍了node.js – Nodejs sqs队列处理器,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
"use strict"; var appConf = require('./config/appConf'); var AWS = require('aws-sdk'); AWS.config.loadFromPath('./config/aws_config.json'); var sqs = new AWS.SQS(); var exec = require('child_process').exec; function readMessage() { sqs.receiveMessage({ "QueueUrl": appConf.sqs_distribution_url,"MaxNumberOfMessages": 1,"VisibilityTimeout": 30,"WaitTimeSeconds": 20 },function (err,data) { var sqs_message_body; if (data.Messages) { if (typeof data.Messages[0] !== 'undefined' && typeof data.Messages[0].Body !== 'undefined') { //sqs msg body sqs_message_body = JSON.parse(data.Messages[0].Body); //make call to nodejs handler in codeigniter exec('PHP '+ appConf.CI_FC_PATH +'/index.PHP nodejs_handler make_contentq_call "'+ sqs_message_body.contentq_cat_id+'" "'+sqs_message_body.cnhq_cat_id+'" "'+sqs_message_body.network_id+'"',function (error,stdout,stderr) { if (error) { throw error; } console.log('stdout: ' + stdout); if(stdout == 'Success'){ //delete message from queue sqs.deleteMessage({ "QueueUrl" : appConf.sqs_distribution_url,"ReceiptHandle" :data.Messages[0].ReceiptHandle }); } }); } } }); } readMessage();
上述代码对队列中的单个消息正常工作.我应该如何编写这个脚本,以便对邮件进行轮询,直到处理所有的消息?我应该使用设置超时吗?
关于轮询消息 – 您可能会使用不同的技术,包括定时器,但我认为最简单的只是在receiveMessage(或甚至exec)回调函数的末尾调用readMessage()函数.因此,处理(或等待)队列中的下一个消息将在队列中处理先前消息的结束后立即开始.
更新:
至于我在你的新版本的代码中有很多readMessage()调用.我认为最好把它保持在更加清晰和易于维护的状态.但是,如果您离开,例如,在主要的receiveMessage回调结束时只有一个调用,您将收到许多并行运行的PHP工作脚本 – 也许从性能的角度来看,它不是那么糟糕 – 但是将不得不添加一些复杂的脚本来控制并行工作人员的数量.我想你可以在exec回调中调用一些调用,尝试加入ifs并在主回调中加入调用.
"use strict"; var appConf = require('./config/appConf'); var AWS = require('aws-sdk'); AWS.config.loadFromPath('./config/aws_config.json'); var delay = 20 * 1000; var sqs = new AWS.SQS(); var exec = require('child_process').exec; function readMessage() { sqs.receiveMessage({ "QueueUrl": appConf.sqs_distribution_url,data) { var sqs_message_body; if (data.Messages) && (typeof data.Messages[0] !== 'undefined' && typeof data.Messages[0].Body !== 'undefined')) { //sqs msg body sqs_message_body = JSON.parse(data.Messages[0].Body); //make call to nodejs handler in codeigniter exec('PHP '+ appConf.CI_FC_PATH +'/index.PHP nodejs_handler make_contentq_call "'+ sqs_message_body.contentq_cat_id+'" "'+sqs_message_body.cnhq_cat_id+'" "'+sqs_message_body.network_id+'"',stderr) { if (error) { // error handling } if(stdout == 'Success'){ //delete message from queue sqs.deleteMessage({ "QueueUrl" : appConf.sqs_distribution_url,"ReceiptHandle" :data.Messages[0].ReceiptHandle },function(err,data){ }); } readMessage(); }); } } readMessage(); }); } readMessage();
关于内存泄漏:我认为你不应该担心,因为下一次调用readMessage()发生在回调函数中 – 所以不是递归的,递归调用函数只是在调用receiveMessage()函数之后返回父函数的值.
以上是大佬教程为你收集整理的node.js – Nodejs sqs队列处理器全部内容,希望文章能够帮你解决node.js – Nodejs sqs队列处理器所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。