AWS Lambda不会从队列中删除消息

时间:2019-07-12 09:04:57

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

我正在使用以下代码从SQS事件中触发Lambda函数:

@Override
public Void handleRequest(SQSEvent sqsEvent, Context context) {
    for (SQSMessage sqsMessage : sqsEvent.getRecords()) {
        final String body = sqsMessage.getBody();
        try {
            //do stuff here
        } catch (Exception ex) {
            //send to DLQ
        }
    }
    return null;
}

“做事”正在使用以下代码调用另一个Lambda函数:

private final AWSLambda client;
    private final String functionName;

    public LambdaService(AWSLambdaAsync client, String functionName) {
        this.client = client;
        this.functionName = functionName;
    }

    public void runWithPayload(String payload) {
        logger.info("Invoking lambda {} with payload {}", functionName, payload);
        final InvokeRequest request = new InvokeRequest();
        request.withFunctionName(functionName).withPayload(payload);
        final InvokeResult invokeResult = client.invoke(request);
        final Integer statusCode = invokeResult.getStatusCode();
        logger.info("Invoked lambda {} with payload {}. Got status code {} and response payload {}",
                functionName,
                payload,
                statusCode,
                StandardCharsets.UTF_8.decode(invokeResult.getPayload()).toString());
        if(statusCode.equals(200) == false) {
            throw new IllegalStateException(String.format("There was an error executing the lambda function %s with payload %s", functionName, payload));
        }
    }

我正在使用以下库:

<dependency>
  <groupId>com.amazonaws</groupId>
  <artifactId>aws-lambda-java-core</artifactId>
  <version>1.2.0</version>
</dependency>
<dependency>
  <groupId>com.amazonaws</groupId>
  <artifactId>aws-lambda-java-events</artifactId>
  <version>2.2.6</version>
</dependency>
<dependency>
  <groupId>com.amazonaws</groupId>
  <artifactId>aws-java-sdk-sqs</artifactId>
  <version>1.11.505</version>
</dependency>
<dependency>
  <groupId>com.amazonaws</groupId>
  <artifactId>aws-java-sdk-lambda</artifactId>
  <version>1.11.505</version>
</dependency>

问题是SQS消息似乎没有从队列中删除,并且一遍又一遍地进行了重新处理。它每30秒发生一次,恰好是Default Visibility Timeout的值。现在,据我所知,如果使用sqs消息的lambda正确终止,它应该自动从队列中删除该消息,但这没有发生。 我不认为lambda中发生任何错误,因为我没有在DLQ中收到任何消息(并且我有一个包罗万象的块),并且在Cloudwatch的日志中看不到任何stacktrace。我对这里发生的事情感到困惑,有人知道吗?

1 个答案:

答案 0 :(得分:0)

除非最近有所更改,否则我认为适用于Java的AWS开发工具包不会自动从队列中删除消息。您需要编写代码来做到这一点。

我很想被证明是错误的,请分享我错过的文档摘录。

代码示例: