问题描述
我需要调用一次 lambda 函数(无需重试)。 执行该 lambda 最多需要 5/10 分钟。
我发现了多篇关于超时的帖子,每一篇都没有成功
try {
InvokeRequest invokeRequest = new InvokeRequest()
.withFunctionName("mylambdaname")
.withPayload(objectMapper.writeValueAsstring(payload));
//invokeRequest.setSdkRequestTimeout(0);
//invokeRequest.setSdkClientExecutionTimeout(0);
//invokeRequest.withSdkRequestTimeout(0);
//invokeRequest.withSdkClientExecutionTimeout(0);
AWSLambda awsLambda = AWSLambdaClientBuilder.standard()
.withCredentials(new EC2ContainerCredentialsProviderWrapper())
.withRegion(Regions.EU_WEST_1)
.withClientConfiguration(new ClientConfiguration()
//.withConnectionTimeout(0)
//.withRequestTimeout(0)
//.withClientExecutionTimeout(0)
//.withSocketTimeout(0)
.withMaxErrorRetry(0)
).build();
awsLambda.invoke(invokeRequest);
} catch (ServiceException | JsonProcessingException e) {
LOGGER.error(e.getMessage());
}
设置超时(如 15*60*1000)或无 (0) 仍会在恰好一分钟后触发 ReadTimeout
。
我还尝试从 AWS 安装 SDK v2,但出现了同样的问题。
尝试过的例子:
- AWS Lambda timeout when another (long) Lambda is invoked
- How to increase the timeout for AWS Lambda client
- AWS Lambda Java function invoked multiple times
PS:如果长任务被缩短,lambda 确实可以工作,所以这里的一切都与超时有关
完整的堆栈跟踪
java.net.socketTimeoutException:读取超时
在 java.net.socketInputStream.socketRead0(本机方法)
在 java.net.socketInputStream.socketRead(SocketInputStream.java:116)
在 java.net.socketInputStream.read(SocketInputStream.java:171)
在 java.net.socketInputStream.read(SocketInputStream.java:141)
在 sun.security.ssl.SSLSocketInputRecord.read(SSLSocketInputRecord.java:457)
在 sun.security.ssl.SSLSocketInputRecord.bytesInCompletePacket(SSLSocketInputRecord.java:68)
在 sun.security.ssl.SSLSocketImpl.readApplicationRecord(SSLSocketImpl.java:1095)
在 sun.security.ssl.SSLSocketImpl.access$200(SSLSocketImpl.java:72)
在 sun.security.ssl.SSLSocketImpl$AppInputStream.read(SSLSocketImpl.java:815)
在 org.apache.http.impl.io.SessionInputBufferImpl.streamRead(SessionInputBufferImpl.java:137)
在 org.apache.http.impl.io.SessionInputBufferImpl.fillBuffer(SessionInputBufferImpl.java:153)
在 org.apache.http.impl.io.SessionInputBufferImpl.readLine(SessionInputBufferImpl.java:280)
在 org.apache.http.impl.conn.DefaultHttpResponseParser.parseHead(DefaultHttpResponseParser.java:138)
在 org.apache.http.impl.conn.DefaultHttpResponseParser.parseHead(DefaultHttpResponseParser.java:56)
在 org.apache.http.impl.io.AbstractMessageParser.parse(AbstractMessageParser.java:259)
在 org.apache.http.impl.DefaultBHttpClientConnection.receiveResponseHeader(DefaultBHttpClientConnection.java:163)
在 org.apache.http.impl.conn.CPoolProxy.receiveResponseHeader(CPoolProxy.java:157)
在 org.apache.http.protocol.HttpRequestExecutor.doReceiveResponse(HttpRequestExecutor.java:273)
在 com.amazonaws.http.protocol.SdkHttpRequestExecutor.doReceiveResponse(SdkHttpRequestExecutor.java:82)
在 org.apache.http.protocol.HttpRequestExecutor.execute(HttpRequestExecutor.java:125)
在 org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:272)
在 org.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.java:186)
在 org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:185)
在 org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:83)
在 org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:56)
在 com.amazonaws.http.apache.client.impl.SdkHttpClient.execute(SdkHttpClient.java:72)
在 com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeOneRequest(AmazonHttpClient.java:1258)
在 com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeHelper(AmazonHttpClient.java:1074)
在 com.amazonaws.http.AmazonHttpClient$RequestExecutor.doExecute(AmazonHttpClient.java:745)
在 com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeWithTimer(AmazonHttpClient.java:719)
在 com.amazonaws.http.AmazonHttpClient$RequestExecutor.execute(AmazonHttpClient.java:701)
在 com.amazonaws.http.AmazonHttpClient$RequestExecutor.access$500(AmazonHttpClient.java:669)
在 com.amazonaws.http.AmazonHttpClient$RequestExecutionBuilderImpl.execute(AmazonHttpClient.java:651)
在 com.amazonaws.http.AmazonHttpClient.execute(AmazonHttpClient.java:515)
在 com.amazonaws.services.lambda.AWSLambdaClient.doInvoke(AWSLambdaClient.java:2682)
在 com.amazonaws.services.lambda.AWSLambdaClient.invoke(AWSLambdaClient.java:2651)
在 com.amazonaws.services.lambda.AWSLambdaClient.invoke(AWSLambdaClient.java:2640)
在 com.amazonaws.services.lambda.AWSLambdaClient.executeInvoke(AWSLambdaClient.java:1503)
在 com.amazonaws.services.lambda.AWSLambdaClient.invoke(AWSLambdaClient.java:1474)
在 Repository.invokeLambda(Repository.java:60)
在 Service.invoke(Service.java:40)
在 Controller.invoke(Controller.java:37)
在控制器$$FastClassBySpringcglib$$9d602606.invoke()
解决方法
这些方法应该可以完成我看到您已注释掉的技巧:
TOOL_NODE_FLAGS
setSDKRequestTimeout(int milliseconds)
我认为您不应该使用 0。您应该使用 setSdkClientExecutionTimeout(int milliseconds)