gpt4 book ai didi

java - AWS Lambda 不从队列中删除消息

转载 作者:行者123 更新时间:2023-12-02 03:09:25 24 4
gpt4 key购买 nike

我使用以下代码从 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;
}

“do stuff”正在使用以下代码调用另一个 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 中没有收到任何消息(并且我有一个包罗万象的 block ),并且在 Cloudwatch 的日志中看不到任何堆栈跟踪。我对这里发生的事情有点困惑,有人有什么好主意吗?

最佳答案

除非最近发生了变化,否则我认为适用于 Java 的 AWS 开发工具包不会自动从队列中删除消息。您需要编写代码来执行此操作。

我很乐意在这一点上被证明是错误的,请分享我错过的文档摘录。

代码示例:

关于java - AWS Lambda 不从队列中删除消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57003706/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com