如何异步调用 AWS Lambda 函数
How to invoke an AWS Lambda function asynchronously
有谁知道异步而不是同步调用 Amazon AWS Lambda 函数的当前正确方法吗?
AWS Java SDK 中的 InvokeAsync API 仍然可用,但已标记为已弃用,他们建议您使用 Invoke API。我不明白为什么他们会强迫我们使用同步。我有一个分派一些批处理作业的网络前端。我不能指望前端在等待响应时保持连接打开几分钟(实际上是在处理大约 4-5 分钟后通过电子邮件发送给他们)。
理想情况下,我正在尝试弄清楚如何使用他们的 API 端点而不是 Java SDK 来做到这一点,因为我 运行 我的环境 (GAE)后端不支持 AWS 使用 HttpClient。
我正在查看最新的 API 文档 here,看起来只有 AWSLambdaAsyncClient.invokeAsyncAsync()
被弃用了。 AWSLambdaAsyncClient.invokeAsync()
方法未标记为已弃用。看起来他们只是通过消除对 InvokeAsyncRequest
和 InvokeAsyncResult
类 以及额外的 invokeAsyncAsync()
方法的需要来进行一些代码清理。
您应该能够使用 AWSLambdaAsyncClient.invokeAsync()
方法,该方法使用 InvokeRequest
和 returns InvokeResult
。您可能必须将 InvokeRequest
上的 InvocationType
设置为 InvocationType.Event
。如果您使用的是异步客户端,则不清楚是否需要这样做。
关于您关于不使用 SDK 异步调用 Lambda 函数的第二个问题,我会考虑使用 API Gateway as a service proxy。这是为异步调用公开 Lambda 函数的推荐方法。
以下代码可用于从另一个 Lambda 异步调用 Lambda
AWSLambdaAsyncClient client = new AWSLambdaAsyncClient();
client.withRegion(Regions.fromName(region));
InvokeRequest request = new InvokeRequest();
request.setInvocationType("Event");
request.withFunctionName(functionName).withPayload(payload);
InvokeResult invoke = client.invoke(request);
接受的答案中给出的方法现已弃用。用户@dassum给出的答案是遵循的方法,但答案缺少一点解释。
创建InvokeRequest时,设置InvocationType为"Event"异步调用,"RequestResponse"同步调用。
AWSLambda lambda = //create your lambda client here
lambda.invoke(new InvokeRequest()
.withFunctionName(LAMBDA_FUNCTION_NAME)
.withInvocationType(InvocationType.Event) //asynchronous
.withPayload(payload))
参考文档:
您可以尝试以下方法:
YourCustomRequestBean request = new YourCustomRequestBean();
request.setData1(data1);
request.setData2(data2);
request.setData3(data3);
ClientConfiguration clientConfiguration = new ClientConfiguration();
clientConfiguration.setSocketTimeout(xxxx);
clientConfiguration.setRequestTimeout(xxxx);
ObjectMapper objectMapper = new ObjectMapper();
String jsonStr = objectMapper.writeValueAsString(request);
AWSLambdaAsync awsLambdaAsync =
AWSLambdaAsyncClientBuilder.standard().withRegion(<mention your region here>).withClientConfiguration(clientConfiguration).build();
InvokeRequest invokeRequest = new InvokeRequest()
.withFunctionName(lambda function urn)
.withPayload(jsonStr);
awsLambdaAsync.invokeAsync(invokeRequest);
有谁知道异步而不是同步调用 Amazon AWS Lambda 函数的当前正确方法吗?
AWS Java SDK 中的 InvokeAsync API 仍然可用,但已标记为已弃用,他们建议您使用 Invoke API。我不明白为什么他们会强迫我们使用同步。我有一个分派一些批处理作业的网络前端。我不能指望前端在等待响应时保持连接打开几分钟(实际上是在处理大约 4-5 分钟后通过电子邮件发送给他们)。
理想情况下,我正在尝试弄清楚如何使用他们的 API 端点而不是 Java SDK 来做到这一点,因为我 运行 我的环境 (GAE)后端不支持 AWS 使用 HttpClient。
我正在查看最新的 API 文档 here,看起来只有 AWSLambdaAsyncClient.invokeAsyncAsync()
被弃用了。 AWSLambdaAsyncClient.invokeAsync()
方法未标记为已弃用。看起来他们只是通过消除对 InvokeAsyncRequest
和 InvokeAsyncResult
类 以及额外的 invokeAsyncAsync()
方法的需要来进行一些代码清理。
您应该能够使用 AWSLambdaAsyncClient.invokeAsync()
方法,该方法使用 InvokeRequest
和 returns InvokeResult
。您可能必须将 InvokeRequest
上的 InvocationType
设置为 InvocationType.Event
。如果您使用的是异步客户端,则不清楚是否需要这样做。
关于您关于不使用 SDK 异步调用 Lambda 函数的第二个问题,我会考虑使用 API Gateway as a service proxy。这是为异步调用公开 Lambda 函数的推荐方法。
以下代码可用于从另一个 Lambda 异步调用 Lambda
AWSLambdaAsyncClient client = new AWSLambdaAsyncClient();
client.withRegion(Regions.fromName(region));
InvokeRequest request = new InvokeRequest();
request.setInvocationType("Event");
request.withFunctionName(functionName).withPayload(payload);
InvokeResult invoke = client.invoke(request);
接受的答案中给出的方法现已弃用。用户@dassum给出的答案是遵循的方法,但答案缺少一点解释。
创建InvokeRequest时,设置InvocationType为"Event"异步调用,"RequestResponse"同步调用。
AWSLambda lambda = //create your lambda client here
lambda.invoke(new InvokeRequest()
.withFunctionName(LAMBDA_FUNCTION_NAME)
.withInvocationType(InvocationType.Event) //asynchronous
.withPayload(payload))
参考文档:
您可以尝试以下方法:
YourCustomRequestBean request = new YourCustomRequestBean();
request.setData1(data1);
request.setData2(data2);
request.setData3(data3);
ClientConfiguration clientConfiguration = new ClientConfiguration();
clientConfiguration.setSocketTimeout(xxxx);
clientConfiguration.setRequestTimeout(xxxx);
ObjectMapper objectMapper = new ObjectMapper();
String jsonStr = objectMapper.writeValueAsString(request);
AWSLambdaAsync awsLambdaAsync =
AWSLambdaAsyncClientBuilder.standard().withRegion(<mention your region here>).withClientConfiguration(clientConfiguration).build();
InvokeRequest invokeRequest = new InvokeRequest()
.withFunctionName(lambda function urn)
.withPayload(jsonStr);
awsLambdaAsync.invokeAsync(invokeRequest);