Dev*_*per 5 asynchronous java-8 aws-lambda
当我在lambda函数中启动一个新线程并返回时,它似乎停止执行新线程并关闭。
public class Importer implements RequestHandler<Request<ImportJob>, Response> {
@Override
public Response handleRequest(final Request<ImportJob> request, final Context context) {
CompletableFuture.runAsync(() -> uploadOriginalFile(importJob), ioThreadPool)
.thenRunAsync(() -> convert(importJob), importThreadPool)
.thenRun(() -> createThumbnail(importJob))
.handleAsync((r, cause) -> completeJob(importJob, cause), ioThreadPool);
return new Response("Execution started");
}
}
Run Code Online (Sandbox Code Playgroud)
当我等待使用执行所有CompletableFuture时join(),它会按预期运行,但是当我尝试在aysnc中运行它时,立即返回响应并终止。还有其他方法可以异步运行lambda还是我做错了什么?
还有其他方法可以异步运行lambda还是我做错了什么?
可以使用同步“请求/响应”模型或异步“事件”模型来调用Lambda函数。最终,这两种调用类型与Lambda函数中的代码的工作方式无关。
RequestResponse(同步)-在函数返回响应或错误或者调用运行超过允许时间之前,Lambda API调用不会返回;必须通过再次调用自己来重试失败。Event(异步)-Lambda API调用立即返回,该函数运行至完成,其输出被丢弃;故障重试两次。似乎您正在使用请求/响应来调用该函数,但是在返回响应之后尝试继续工作,这忽略了Lambda服务设计的本质部分。每次调用一直运行到完成为止,然后返回响应。当异步调用时,响应将被丢弃,但是该响应表明执行结束,即函数在其任务上成功或失败。Lambda会停止开票计时器,然后冻结或销毁该容器。同步响应不能在执行结束之前返回。
Lambda在每个容器中仅运行一个并发调用,因此您不需要多个线程,除非单个调用要做的一件事情需要自己的线程。
如果需要Lambda函数的输出和更多处理才能在后台继续,则需要function1调用请求/响应,而function1需要调用Lambda服务API并异步调用function2。
在这种情况下,您似乎实际上并不需要输出,因此您可以通过将X-Amz-Invocation-Type:Event标头添加到集成请求中来从API Gateway异步调用此函数 -但您的函数需要“阻止”直到完成-就是说,在完成处理之前,它不应返回响应(请记住,响应将被丢弃)。除非您记得每个并行调用都在其自己的容器中运行,否则这似乎是违反直觉的。
| 归档时间: |
|
| 查看次数: |
1454 次 |
| 最近记录: |