SQS Отправить сообщение Процесс get выполняется несколько раз - PullRequest
0 голосов
/ 26 апреля 2020

У меня есть лямбда-функция, работающая с API Gateway. Когда он получает webhook, мне нужно отправить ответ 200 ok XML обратно, а также добавить атрибуты тела запроса в SQS. Сначала он не отправил сообщение в SQS надежно. Я исправил это, добавив await и promise () к функции sendMessage. Процесс отправки сообщения выполняется несколько раз внутри одного и того же запроса. Я вижу 2 или более журналов успеха для sendMessage для одного и того же идентификатора запроса в журналах наблюдения за облаком.


var AWS = require('aws-sdk');
AWS.config.update({region: 'us-east-1'});
var sqs = new AWS.SQS({apiVersion: '2012-11-05'});
const parser = require('xml-js');

exports.submit = async (event, context) => {
  let json = parser.xml2js(event.body, {compact: true});
  let header = json["SOAP-ENV:Envelope"]["SOAP-ENV:Body"]["ns0:PartnerAsyncResponseInput"]["ns0:header"];
  let body = json["SOAP-ENV:Envelope"]["SOAP-ENV:Body"]["ns0:PartnerAsyncResponseInput"]["ns0:body"];
  let input = body["ns0:input"];
  let subscriber = input["ns0:subscriber"];
  let status = subscriber["ns0:result"]["ns0:status"]["_text"];
  let ref_id = input["ns0:partnerTransactionID"]["_text"];
  let date = header['ns0:tranDateTime']["_text"];
  let count = body['ns0:inputCount']["_text"];
  let partner = header['ns0:partnerID']["_text"];

  console.log('Ref ID : ' + ref_id);

  let sqs_data = {
    status: status,
    ref_id: ref_id
  }

  if(subscriber["ns0:MSISDN"])
    sqs_data.msisdn = subscriber["ns0:MSISDN"]["_text"];

  if(subscriber["ns0:ICCID"])
    sqs_data.iccid = subscriber["ns0:ICCID"]["_text"];

  if(subscriber["ns0:IMSI"])
    sqs_data.imsi = subscriber["ns0:IMSI"]["_text"];

  if(subscriber["ns0:accountID"])
    sqs_data.accountId = subscriber["ns0:accountID"]["_text"];

  if(status != 'SUCCESS')
    sqs_data.msg = subscriber["ns0:result"]["ns0:resultMsg"]["_text"];

  let params = {
    MessageBody : JSON.stringify(sqs_data),
    QueueUrl: "https://sqs.us-east-1.amazonaws.com/xxxxxxxxxxxx/MY-SQS",
    DelaySeconds: 10
  };

  await sqs.sendMessage(params, function (err, data) {
    if (err) {
      console.log("Error", JSON.stringify(err));
    } else {
      console.log("Success", data);
    }
  }).promise();

  let response_tmo = '<PartnerAsyncResponseOutput xmlns="http://T-Mobile/Wholesale/xml" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">';
  response_tmo += '<header><partnerID>'+partner+'</partnerID><tranDateTime>'+date+'</tranDateTime></header>';
  response_tmo += '<body>';
  response_tmo += '<output>';
  response_tmo += '<partnerTransactionID>'+ref_id+'</partnerTransactionID><subscriber><result><status>200</status></result></subscriber>';
  response_tmo += '</output>';
  response_tmo += '<outputCount>'+count+'</outputCount></body>';
  response_tmo += '</PartnerAsyncResponseOutput>';

  return {
    statusCode: 200,
    body: response_tmo,
    headers: {
      "Content-Type": "application/xml"
    }
  };

};```
...