![](/img/trans.png)
[英]Java object received in AWS API gateway websocket api on connect
[英]AWS API Gateway WebSocket Timeout?
How do I keep an API Gateway Websocket API with a Lambda Java back end from timing out after 30 seconds?
AWS API 网关和 re:invent 视频提到使用 ping 或心跳来保持 Websocket 连接有效,但我还没有找到一个简单的工作示例(在 Java 中)。 前端使用 HTML 5 Websockets (vanilla javascript)。
我在 Java 中包含了我的 Lambda 测试驱动程序。 它会导致 API 网关 WS API 在 30 秒后超时,如记录所示。 如果您消除延迟,驱动程序将成功返回。 任何帮助表示赞赏...
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Map;
import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.RequestStreamHandler;
import com.fasterxml.jackson.databind.ObjectMapper;
public class TestWSClient implements RequestStreamHandler {
public void handleRequest(InputStream inputStream, OutputStream outputStream, Context context) {
try {
//
// How do we keep API Gateway from timing out after 30 seconds?
// Is something like this even needed in the lambda?
//
new Thread(() -> {
while(true) {
try {
// Ping client every 15 seconds
Thread.sleep(15000);
//outputStream.write(); // What to write -- 0x89 0x00?
outputStream.flush();
} catch(Exception e) { e.printStackTrace(); }
}
}).start();
//
// Simulate long processing time or streaming
//
// NOTE: commenting sleep enables service to return w/o a timeout
// connection from API Gateway
//
try { Thread.sleep(60000); } catch(Exception e) {}
var response = Map.of(
"statusCode", 200,
"headers", Map.of("Content-Type", "text/csv"),
"body", "Hello,World"
);
ObjectMapper om = new ObjectMapper();
outputStream.write(om.writeValueAsBytes(response));
outputStream.flush();
} catch(Exception e) { e.printStackTrace(); }
finally { try { outputStream.close(); } catch(Exception e) {} }
}
}
我认为我没有正确理解您的问题,但根据我的经验,这是 WebSocket API 的工作方式。 客户端 <-(1)-> API 网关 <-(2)-> Lambda
1) 是 web 套接字连接,最长保持打开状态 2 小时,空闲超时为 10 分钟,如此处所述。 https://docs.aws.amazon.com/apigateway/latest/developerguide/limits.html
2 ) 使用@connection https://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-how-to-call-websocket-api-connections.html管理通信
我相信您想使用 @connection 从 lambda 与您的 API 网关通信。
看起来 Lambda 需要 NAT 网关才能调用 AWS ApiGatewayManagementApi SDK 提供的 postToConnection function。
遗憾的是,在 Websockets API 或 API 网关的任何地方都没有指定此要求。
在此页面上搜索“NAT”,然后阅读该句子:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.