【问题标题】:SQS ReceiveMessage succeeds but gets a null messageSQS ReceiveMessage 成功但收到空消息
【发布时间】:2018-10-23 02:39:21
【问题描述】:

我在 lambda 中有以下代码来接收 SQS 消息: 当我将消息注入 SQS 时,lambda 触发,但显示 data.Messages 为空。

function receiveMessages(callback)
{
    var params = {
        QueueUrl: TASK_QUEUE_URL,
        MaxNumberOfMessages: 2,
        WaitTimeSeconds: 1,
        AttributeNames: ["All"]
    };

    SQS.receiveMessage(params, function(err, data)
    {
        if (err)
        {
            console.error(err, err.stack);
            callback(err);
        }
        else if (data.Messages == null)
        {
            console.log("null message", data);
            callback(null,null);
        }
        else
        {
            callback(null, data.Messages);
        }
    });
}

我可能做错了什么并不明显。我尝试了fifo和非fifo队列

【问题讨论】:

  • 您的 Lambda 函数是如何被调用的?我假设您不是using the queue as an event source,因为这仅适用于非fifo...但是如果您是,则消息已经在event 中-您不会使用receiveMessages()
  • 队列中真的有可用的消息吗?如果队列为空,您所描述的内容听起来像是正确的行为。
  • @Michael-sqlbot 谢谢 - 这确实是问题所在。我使用队列作为事件源,然后在其上执行 receivemessage(),这是不需要的。我

标签: amazon-web-services aws-lambda amazon-sqs


【解决方案1】:

using an SQS Queue as a Lambda event source 时,Lambda 服务的一个组件实际上轮询队列并将消息有效负载传递给函数调用,在数组event.Records 中,该数组将包含来自队列的一条或多条消息。消息在队列中暂时不可见(它们“在飞行中”)。

您无需在此应用程序中直接与 SQS 交互。

您成功处理了消息并退出了 Lambda 函数,并且刚刚提供给您的所有消息都会被 Lambda 轮询器自动从队列中删除。

如果抛出异常,您刚刚收到的所有消息都会重新设置为在队列中可见。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-07-22
    • 2016-07-21
    • 2018-04-24
    • 2016-08-06
    • 1970-01-01
    • 2013-08-28
    • 1970-01-01
    • 2020-05-28
    相关资源
    最近更新 更多