我正在使用以下代码从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。我对这里发生的事情感到困惑,有人知道吗?
答案 0 :(得分:0)
除非最近有所更改,否则我认为适用于Java的AWS开发工具包不会自动从队列中删除消息。您需要编写代码来做到这一点。
我很想被证明是错误的,请分享我错过的文档摘录。
代码示例: