我有2个lambda函数,我的第一个函数w / c我们将调用" PostStep"调用另一个lambda函数" RetryStep"每当发生超时时都是异步的。从那时起它一直很好用。现在我必须做一些代码更改,并且在测试期间,发生了一个奇怪的问题。
超时后,它仍然异步调用RetryStep函数,但是实际上并没有调用该函数。我尝试再次调用PostStep函数,然后我注意到实际调用了RetryStep函数的时间,但是使用了之前请求的数据。
以下是我如何进行调用:
LivePostingService.class
@Override
public void postTransaction(Transaction transaction) {
... some posting logic ...
conditionalCallRetryLambdaFunction(transaction);
}
private void conditionalCallRetryLambdaFunction(Transaction transaction) {
try {
String payload = objectMapper.writeValueAsString(transaction);
lambdaInvokerService.invokeAsync(lambdaRetryFunctionName, payload);
} catch (JsonProcessingException e) {
if(LOGGER.isErrorEnabled()) {
LOGGER.error(e.getMessage(), e);
}
}
}
LambdaInvokerService.class
@Service
public class LambdaInvokerServiceImpl implements LambdaInvokerService {
LOGGER.info("Calling lambda function: " + functionName + ", with payload: " + payload);
InvokeRequest req = new InvokeRequest()
.withFunctionName(functionName)
.withInvocationType(InvocationType.Event)
.withPayload(payload);
AsyncHandler<InvokeRequest, InvokeResult> asyncHandler = new AsyncHandler<InvokeRequest, InvokeResult>() {
@Override
public void onError(Exception e) {
LOGGER.error(e.getMessage());
}
@Override
public void onSuccess(InvokeRequest request, InvokeResult invokeResult) {
LOGGER.info("Success! " + invokeResult);
}
};
lambdaAsyncClient.invokeAsync(req, asyncHandler);
}
这是我的经纪人:
@Override
public Void handleRequest(DynamodbEvent dynamodbEvent, Context context) {
livePostingService.postTransaction(transaction);
return null;
}
从代码中可以看出,日志调用lambda函数.. 出现在PostStep函数的末尾,但日志成功!出现在如果我再次调用PostStep函数。
与我们目前正在制作的产品相同的代码。我甚至在我们的主分支上进行了git checkout,然后在dev上运行它,但同样的问题仍然存在。你对此有什么想法吗?
谢谢!