我有一个NodeJS Elastic Beanstalk工人层环境,该环境从SQS队列中获取消息并将其发布到外部URL。下面的代码按预期工作,但消息在SQS中保持“运行中”。我看不到任何有关如何通知SQS消息已成功处理的文档?
var http = require('http'),
request = require("request"),
fs = require('fs');
http.createServer(function (req, res) {
req.on('data', function (data) {
var jsonObj = JSON.parse(data);
var jsonString = JSON.stringify(jsonObj);
log("Processing " + jsonString);
request.post('http://example.com', {
json: true,
body: jsonString,
headers: {
"content-type": "application/json",
}
}, (error, res, body) => {
if (error) {
log(`Error ${error}`);
return;
}
returnResponse(res, JSON.stringify(body));
})
});
}).listen(process.env.PORT || 3000);
function returnResponse(httpResponse, message) {
log(`Response status code ${httpResponse.statusCode} - ${message}`);
httpResponse.writeHead(httpResponse.statusCode);
httpResponse.write(message);
httpResponse.end();
}
var log = function (entry) {
fs.appendFileSync('/tmp/output.log', new Date().toISOString() + ' - ' + entry + '\n');
};
答案 0 :(得分:1)
正在投放的消息表示该消息已被消费者使用,但尚未从队列中删除。如果使用者在队列的可见性超时期间未将其删除,它将由SQS重新放回队列。
如果成功处理消息,则应从队列中删除它们。如果您熟悉AMQP 0-9-1,则此操作类似于确认消息。
由于您使用的是Node.js,因此this是官方SDK中的方法,应使用它来实现目标。
答案 1 :(得分:0)
这是固定代码:
var http = require('http'),
request = require("request"),
fs = require('fs');
http.createServer(function (req, res) {
req.on('data', function (data) {
var jsonObj = JSON.parse(data);
var jsonString = JSON.stringify(jsonObj);
log("Processing " + jsonString);
request.post('http://example.com', {
json: true,
body: jsonString,
headers: {
"content-type": "application/json",
}
}, (error, response, body) => {
if (error) {
log(`Error ${error}`);
return;
}
returnResponse(res, response.statusCode, JSON.stringify(body));
})
});
}).listen(process.env.PORT || 3000);
function returnResponse(res, statusCode, message) {
log(`Response status code ${statusCode} - ${message}`);
res.writeHead(statusCode, {'Content-Type': 'text/plain'});
res.write('Complete');
res.end();
}
var log = function (entry) {
fs.appendFileSync('/tmp/sample-app.log', new Date().toISOString() + ' - ' + entry + '\n');
};
来自https://www.edureka.co/blog/aws-elastic-beanstalk/
守护程序提取从Amazon SQS队列发送的请求。根据队列的优先级,SQS将通过POST请求将消息发送到工作环境的HTTP路径。接收到消息的工作人员将执行任务,并在操作完成后发送HTTP响应。 SQS在收到响应消息时会删除队列中的消息。如果未收到响应,它将连续重试发送消息。
问题是我之前的代码未正确返回http状态代码。