Сообщения не поступают из очереди aws sqs fifo в .net Core

#.net #aws-lambda #amazon-sqs

#.net #aws-lambda #amazon-sqs

Вопрос:

Я использовал aws toolkit в .net для извлечения сообщений из aws sqs в функции lambda, но сообщения не приходят.В этом коде консоль sqs также становится пустой в cloudwatch, и тот же receiveMessageResponse также становится пустым.

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

using Amazon;
using Amazon.Lambda.Core;
using Amazon.SQS;
using Amazon.SQS.Model;


 [assembly: 
LambdaSerializer(typeof(Amazon.Lambda.Serialization.Json.JsonSerializer))]

    namespace AWSLambda1
     {
     public class Function
     {

    /// <summary>
    /// A simple function that takes a string and does a ToUpper
    /// </summary>
    /// <param name="input"></param>
    /// <param name="context"></param>
    /// <returns></returns>
    public string FunctionHandler(string input, ILambdaContext context)
    {
        var sqs = new AmazonSQSClient();
        System.Console.Write("sqs", sqs);
        var queueUrl = "myqueueUrl";
        var receiveMessageRequest = new ReceiveMessageRequest{ QueueUrl = queueUrl};
        var receiveMessageResponse = sqs.ReceiveMessageAsync(receiveMessageRequest);
        System.Console.Write("M", receiveMessageResponse);
            return "true";

    }
}
  

}

Ответ №1:

Вот фрагмент кода, который я использую для чтения очереди, попробуйте использовать его и посмотрите, работает ли он

 static async Task<string> Start()
        {
            string AccessKey = "";
            string SecretKey = "";
            string SQSqueues = "https://sqs.";

            RegionEndpoint Region = RegionEndpoint.

            bool processedSQS = false;
            AWSCredentials credentials = new BasicAWSCredentials(AccessKey, SecretKey);
            var AwsRegion = Region;
            var SQSClient = new AmazonSQSClient(credentials, Region);

            var SQSRequest = new ReceiveMessageRequest
            {
                MessageAttributeNames = AttributesList,
                AttributeNames = new List<string>() { "All" },
                MaxNumberOfMessages = 10,
                QueueUrl = SQSqueues,
                VisibilityTimeout = (int)TimeSpan.FromMinutes(10).TotalSeconds,
                WaitTimeSeconds = (int)TimeSpan.FromSeconds(5).TotalSeconds
            };
            var SQSResponse = SQSClient.ReceiveMessageAsync(SQSRequest);
            SQSResponse.Wait();
            string JsonPass = null;

            if (SQSResponse.Result.Messages.Count > 0)
            {
                foreach (var Message in SQSResponse.Result.Messages)
                {
                    string SqsMessage = Message.Body;
                    bool CallUpload = await Insert.GetConfig(SqsMessage, credentials, AwsRegion, tableName);

                    if (CallUpload == true)
                    {
                        var deleteRequest = new DeleteMessageRequest
                        {
                            QueueUrl = SQSqueues,
                            ReceiptHandle = Message.ReceiptHandle
                        };
                        var deleteResponse = SQSClient.DeleteMessageAsync(deleteRequest);
                        deleteResponse.Wait();
                    }
                }

            }
            return "";
        }
  

Комментарии:

1. Другой способ сделать это — добавить триггер в лямбда-код, который затем будет автоматически запускаться Sqs при появлении новых сообщений, это будет проще, потому что вам не нужно читать сообщения, вы просто используете SQSEvent, который будет содержать сообщение, которое запустило лямбда-код.

Ответ №2:

Вы можете использовать эти два раздела кода для отправки и извлечения данных из FIFO SQS

Отправка данных —

         IAmazonSQS sqs = new AmazonSQSClient(RegionEndpoint.APSoutheast1);

        var sqsRequest = new CreateQueueRequest
        {
            QueueName = "SQSChatFIFOQueue.fifo"
        };
        sqsRequest.Attributes.Add("FifoQueue", "true");
        var createQueueResponse = sqs.CreateQueueAsync(sqsRequest).Resu<
        var myQueueUrl = createQueueResponse.QueueUrl;

        var listQueueRequest = new ListQueuesRequest();
        var listQueueResponse = sqs.ListQueuesAsync(listQueueRequest);

        foreach (var url in listQueueResponse.Result.QueueUrls)
        {
            Console.WriteLine(url);
        }

        var sqsMessageRequest = new SendMessageRequest
        {
            QueueUrl = myQueueUrl,
            MessageBody = userId,
            MessageGroupId = "test",
            MessageDeduplicationId = "test"
        };
        sqs.SendMessageAsync(sqsMessageRequest);
        return myQueueUrl;
  

Извлекать данные —

         var sqs = new AmazonSQSClient(RegionEndpoint.APSoutheast1);
        var queueUrl = sqs.GetQueueUrlAsync("SQSChatFIFOQueue.fifo").Result.QueueUrl;

        var receiveMessageRequest = new ReceiveMessageRequest
        {
            QueueUrl = queueUrl
        };

        var receiveMessageResponce = sqs.ReceiveMessageAsync(receiveMessageRequest).Resu<
  

Комментарии:

1. Код извлечения данных сработал как нельзя лучше, спасибо!