Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
有没有办法';提前返回';来自Java AWS Lambda RequestStreamHandler_Java_Amazon Web Services_Aws Lambda - Fatal编程技术网

有没有办法';提前返回';来自Java AWS Lambda RequestStreamHandler

有没有办法';提前返回';来自Java AWS Lambda RequestStreamHandler,java,amazon-web-services,aws-lambda,Java,Amazon Web Services,Aws Lambda,我正在使用API网关通过https调用JavaAWS Lambda 我有一个案例,我很快知道我想从我的Lambda返回什么状态,但我有更多的工作要做,这不会影响状态 有没有办法向调用者提供状态,但不结束Lambda的执行 我试过: @Override public void handleRequest(InputStream inputStream, OutputStream outputStream, Context context) throws IOException { Json

我正在使用API网关通过https调用JavaAWS Lambda

我有一个案例,我很快知道我想从我的Lambda返回什么状态,但我有更多的工作要做,这不会影响状态

有没有办法向调用者提供状态,但不结束Lambda的执行

我试过:

@Override
public void handleRequest(InputStream inputStream, OutputStream outputStream, Context context) throws IOException {
    JsonWriter writer = new JsonWriter(new OutputStreamWriter(outputStream));
    writer.beginObject();
    writer.name("statusCode").value("200");
    writer.endObject();
    writer.flush();
    writer.close();
    try {
        // this wait represents other work my Lambda is doing,
        // e.g. DB calls, requests to other webservices
        Thread.sleep(10 * 1000);
    } catch (InterruptedException e) {
    }
}
但来电者仍然需要10秒钟才能看到状态。 有什么办法可以满足我的要求吗


我希望使我的应用程序尽可能简单,并尽可能少地启动lambda,而不会让调用方等待超过必要的时间。

您可以在调用方方法中等待这10秒,就在调用下面。

如果您知道应该返回给调用方的状态,并且您必须执行的其他工作不会影响状态代码或http响应,那么为什么要保持lambda执行(这是一个坏主意,因为您是按执行时间x内存计费的)

使用SNS触发另一个lambda以继续该过程。它看起来像:

caller      ->      Lambda   ->   SNS  ->  Lambda
                      |
caller <---(status)----
caller->Lambda->SNS->Lambda
|

来电者我已经更新了问题,以澄清等待代表我的Lambda将完成的工作,但这不会影响返回给来电者的状态,因此不应延迟返回状态。调用另一个Lambda是一个选项,但我认为这不会为我节省任何钱-工作将在一个或另一个Lambda中完成,也需要同样的时间。如果我可以在一个Lambda中完成这一切,那么我的解决方案就更简单了,并且我避免了启动另一个Lambda的可能开销。Lambda启动和类加载大约需要2000毫秒,因此在第一个“冷”请求中对两个Lambda执行此操作将增加4000毫秒的开销。我忘了您正在使用Java…这就是为什么冷启动很痛苦的原因。在返回状态代码之前,您是否尝试过创建一个新线程?我尝试过——但我对文档的阅读(也许我应该将此作为一个单独的问题)是,在后台线程仍在运行的情况下从handleRequest()返回是不安全的——运行Lambda的JVM可能在后台线程完成之前被“冻结”。OT:有趣的是,据我所知,启动过程中代价高昂的部分是类加载,而不是JVM启动本身。是的,你是对的。从架构的角度来看,将一个事件广播到SNS,然后触发另一个lambda来执行特定任务更干净、更安全。你真的需要在同一个lambda中处理,只是为了保持简单?另外,您真的需要使用Java吗?如果可以,可以尝试node或python,这样可以使其保持简单、代码更少和冷启动更快。