AWS Lambda - 缓冲读卡器

时间:2017-04-26 01:07:35

标签: java amazon-web-services aws-lambda bufferedreader

我在AWS Lambda上使用Java来获取站点的URL源代码。我有以下代码:

URL yahoo = new URL(url);
URLConnection yc = yahoo.openConnection();
yc.addRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)");
BufferedReader in = new BufferedReader(newInputStreamReader(yc.getInputStream(), "UTF-8"));
String inputLine;
StringBuilder a = new StringBuilder();
while ((inputLine = in.readLine()) != null)a.append(inputLine);
in.close();
System.out.println(a.toString());

对于某些网站,代码运行得非常好。它每次都在我的本地机器上运行正常。但是,在AWS Lambda上运行时,它会卡在以下部分:

BufferedReader in = new BufferedReader(new InputStreamReader(yc.getInputStream(), "UTF-8"));

然后我得到:任务在20.00秒后超时。

在Lambda日志中,我收到以下错误:

Payload:java.nio.HeapByteBuffer [pos = 0 lim = 115 cap = 115]

我的猜测是,它与编码有关吗?为什么有些网站处理得非常好,有些网站却被这段代码卡住了?

非常感谢所有答案。

3 个答案:

答案 0 :(得分:1)

实现这项工作的简单解决方案是将Lambda放在VPC之外。

请阅读我在这个帖子上的答案,详细解释为什么会发生这种情况。

AWS lambda invoke not calling another lambda function - Node.js

(注意:答案与NodeJS无关)

答案 1 :(得分:0)

这是建立连接,发送请求以及读取响应的第一部分的点。显然,服务器在一个或多个这样的事情上很慢。

答案 2 :(得分:0)

我猜它与这个bug有关 https://bugs.openjdk.java.net/browse/JDK-8149169

尝试从本地系统获取相同的URL(导致Lambda函数超时),看看是否可以找到根本原因。