我试图在SNS服务中使用DynamoDb Item值来发送通知。它失败了超时错误但是从Dynamodb获取成功并且还发送了通知。但它会在处理多次后继续重试和超时。
{ “errorMessage”:“2018-01-02T10:14:55.463Z c18d142e-efa5-11e7-8671-7f3af13c58c7任务在10.01秒后超时” }
现在,我也尝试使用参数context.callbackWaitsForEmptyEventLoop = false
,但dint帮助很多!!似乎没有正确使用它。
下面是一段代码,有人可以帮忙:
exports.handler = function (event, context, callback) {
var AWS = require('aws-sdk');
var doc = require('dynamodb-doc');
var dynamodb = new doc.DynamoDB();
var params = {
TableName : 'abcmsg',
ProjectionExpression: 'Message',
Key : {
"ind" : "ABC10"
}
};
var MESSAGE_ID = getmsg();
function getmsg(MESSAGE_ID) {
dynamodb.getItem(params, function (err, data) {
if (err) {
console.log('ERROR: Dynamo Failed:', err);
getmsg(err);
} else {
console.log('Dynamo Success: ' + JSON.stringify(data, null, ' '));
let MESSAGE_ID = data['Item'].Message;
console.log('data',data['Item'].Message);
getmsg(MESSAGE_ID);
}
});
console.log('MESSAGE_ID',MESSAGE_ID); //print the correct value 'ABCD'
var sns = new AWS.SNS({
region:'eu-west-1',
maxRetries: 0
});
sns.publish({
Message: MESSAGE_ID,
Subject:"Test Message",
TopicArn:"arn:aws:sns:eu-west-1:0123456789012:Lambda"
}, function (err, data) {
if (err) {
console.log(err.stack);
return;
}
console.log('push sent');
});
callback(null,{ "statusCode": 200 });
context.callbackWaitsForEmptyEventLoop = false;
}
};
日志:-----
2018-01-02T10:14:55.005Z c18d142e-efa5-11e7-8671-7f3af13c58c7发电机成功:{
“项目”:{
“消息”:“ABCD”
}
}
2018-01-02T10:14:55.005Z c18d142e-efa5-11e7-8671-7f3af13c58c7数据ABCD
2018-01-02T10:14:55.006Z c18d142e-efa5-11e7-8671-7f3af13c58c7 MESSAGE_ID ABCD
2018-01-02T10:14:55.028Z c18d142e-efa5-11e7-8671-7f3af13c58c7推送
2018-01-02T10:14:55.086Z c18d142e-efa5-11e7-8671-7f3af13c58c7发电机成功:{
“项目”:{
“消息”:“ABCD”
}
}
2018-01-02T10:14:55.105Z c18d142e-efa5-11e7-8671-7f3af13c58c7数据ABCD
2018-01-02T10:14:55.106Z c18d142e-efa5-11e7-8671-7f3af13c58c7 MESSAGE_ID ABCD
2018-01-02T10:14:55.127Z c18d142e-efa5-11e7-8671-7f3af13c58c7推送
2018-01-02T10:14:55.167Z c18d142e-efa5-11e7-8671-7f3af13c58c7发电机成功:{
“项目”:{
“消息”:“ABCD”
}
}
2018-01-02T10:14:55.185Z c18d142e-efa5-11e7-8671-7f3af13c58c7数据ABCD
2018-01-02T10:14:55.186Z c18d142e-efa5-11e7-8671-7f3af13c58c7 MESSAGE_ID ABCD
2018-01-02T10:14:55.226Z c18d142e-efa5-11e7-8671-7f3af13c58c7推送
2018-01-02T10:14:55.253Z c18d142e-efa5-11e7-8671-7f3af13c58c7发电机成功:{
“项目”:{
“消息”:“ABCD”
}
}
2018-01-02T10:14:55.265Z c18d142e-efa5-11e7-8671-7f3af13c58c7数据ABCD
2018-01-02T10:14:55.285Z c18d142e-efa5-11e7-8671-7f3af13c58c7 MESSAGE_ID ABCD
2018-01-02T10:14:55.306Z c18d142e-efa5-11e7-8671-7f3af13c58c7推送
2018-01-02T10:14:55.345Z c18d142e-efa5-11e7-8671-7f3af13c58c7发电机成功:{
“项目”:{
“消息”:“ABCD”
}
}
2018-01-02T10:14:55.365Z c18d142e-efa5-11e7-8671-7f3af13c58c7数据ABCD
2018-01-02T10:14:55.366Z c18d142e-efa5-11e7-8671-7f3af13c58c7 MESSAGE_ID ABCD
2018-01-02T10:14:55.386Z c18d142e-efa5-11e7-8671-7f3af13c58c7推送
2018-01-02T10:14:55.406Z c18d142e-efa5-11e7-8671-7f3af13c58c7推送
2018-01-02T10:14:55.445Z c18d142e-efa5-11e7-8671-7f3af13c58c7发电机成功:{
“项目”:{
“消息”:“ABCD”
}
}
2018-01-02T10:14:55.445Z c18d142e-efa5-11e7-8671-7f3af13c58c7数据ABCD
END RequestId:c18d142e-efa5-11e7-8671-7f3af13c58c7
报告RequestId:c18d142e-efa5-11e7-8671-7f3af13c58c7持续时间:10010.15 ms结算时长:10000 ms内存大小:128 MB最大使用内存:44 MB
2018-01-02T10:14:55.463Z c18d142e-efa5-11e7-8671-7f3af13c58c7任务在10.01秒后超时
答案 0 :(得分:0)
看起来您正在尝试使用键值"ind" : "ABC10"
获取项目并通知使用SNS。
在这种情况下,成功sns.publish
时应调用getItem
,即代替getmsg(MESSAGE_ID)
,应调用sns publish function
(即您需要创建一个sns publish code block
发布消息)或者应该执行Person personToFind = new Person("Doe", "Jane");
Person person = persons.stream()
.filter(p -> p.equals(personToFind))
.findFirst()
.orElseGet(() ->
persons.stream()
.filter(p -> p.getSurname().equals(personToFind.getSurname()))
.findFirst()
.orElseThrow(() -> new RuntimeException("Could not find person ..."))
);
(即只需将sns发布代码块复制并粘贴到getItem else部分内)。
我不明白你为什么要调用getmsg(错误)(即在getItem错误时)或getmsg(MESSAGE_ID)(即getItem成功)?我认为这是不正确。它基本上是在循环中调用getItem,导致超时错误。