当前位置: 首页 > 知识库问答 >
问题:

当抛出未捕获的异常时,Amazon AWS Lambda Java函数花费不合理的长时间来完成是否正常?

陶胤
2023-03-14

当抛出未捕获的异常时,任何Amazon AWS Lambda Java函数需要不合理的长时间才能完成,这正常吗?请注意,这是一个关于Java中Amazon Lambdas的一般性问题,因为我正在以一种非常通用的方式测试这个问题,使用一个非常简单的bare bones函数。

例如,考虑下面的函数,它验证PIN。如果PIN有效,则返回文本:PIN is ok:“a”。否则,将抛出IOException:

public class Hello implements RequestStreamHandler {    
    private static final int BUFFER_SIZE = 65_536;    
    private static final int MAX_SIZE = 262_144;    
    private static final String CHARSET_UTF8 = "UTF-8";    
    private static final byte[] buffer = new byte[BUFFER_SIZE];    
    private static final ByteArrayOutputStream baos = new ByteArrayOutputStream();

    public void handleRequest(InputStream inputStream, OutputStream outputStream, Context context) throws IOException {

        String input = readInputStreamToString(inputStream);

        // PIN is valid.
        if (input.equals("\"A\"")) 
            writeStringToOutputStream(outputStream, "PIN is OK: " + input);

        // PIN is not valid.
        else 
            throw new IOException("PIN is wrong: " + input);
        }

    private String readInputStreamToString(InputStream inputStream) throws IOException {
        baos.reset();
        int length, total = 0;
        while ((length = inputStream.read(buffer)) != -1) {
            total += length;
            if (total > MAX_SIZE) throw new IllegalStateException("InputStream bigger than " + MAX_SIZE + ".");
            baos.write(buffer, 0, length);
            }
        return baos.toString(CHARSET_UTF8);
        }

    private void writeStringToOutputStream(OutputStream outputStream, String info) throws IOException {
        byte[] chars = info.getBytes(CHARSET_UTF8);
        outputStream.write(chars, 0, chars.length);
        }
    }

要测试上述代码:

>

  • 对于有效引脚,使用“a”作为测试数据。

    {
      "errorMessage": "2017-10-15T21:35:58.744Z *** Task timed out after 3.00 seconds",
      "errorType": "java.lang.RuntimeException"
    }
    
    {
      "errorMessage": "PIN is wrong: \"B\"",
      "errorType": "java.io.IOException",
      "stackTrace": [ "example.Hello.handleRequest(Hello.java:83)" ]
    }
    

    1)lambda函数中的异常要花那么多时间让Amazon处理是否正常?为什么?如果不是,为什么我会有这个问题?

    2)处理异常的推荐方法是什么?我应该永远不让一个函数以异常结束吗?

  • 共有1个答案

    徐友樵
    2023-03-14

    1)不要在意使用的最大内存。根据我的经验,128 MB对于Java函数来说是很少的,不仅仅是由于JVM开销导致的异常。您应该将它增加到至少4倍。但是,请记住,异常不是免费的:

    参见前面的问题:

    Java异常的速度有多慢?

    http://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-create-api-as-simple-proxy-for-lambda.html?shortfooter=true#api-gateway-proxy-integration-lambda-function-java

     类似资料:
    • 问题内容: 当我编译下面的代码时,出现以下错误: 代码: 我已经宣布要抛出它。我想念什么? 完整代码在https://github.com/spakai/composite_indexes中 问题答案: 从Java 8开始,检查异常比Java承诺的要早得多,并且不能与它们很好地配合使用。从技术上讲,BiFunction不会声明抛出任何检查异常。因此,您传递给的,也不能将其抛出。 请通过继承选中。还

    • 当我编译下面的代码时,我得到以下错误: 代码: 我已经宣布它被扔掉了。我错过了什么? 完整的代码在https://github.com/spakai/composite_indexes

    • 我们使用带有Log4j的springaop来登录我们的应用程序。我在应用程序中实现了@Before、@After、@posterhrowing建议。但我面临以下问题: 当任何异常在catch块中被捕获时,它不会调用@afterhrowing通知来打印错误堆栈跟踪。 我想为catch块中捕获的异常打印“错误堆栈跟踪”。意味着无论何时在try块中发生任何异常并被catch捕获,都应该调用一些建议来打印

    • 嘿StackOverflow社区, 关于抛出异常。一般什么时候抛出和异常,什么时候抓取? 假设我遇到了这样的情况,我不得不退出,因为发生了一些问题,我无法从它中恢复过来。我是投还是接? 我现在就这么做: 这样做对吗?如果我只是抛出异常会更合适吗?对不起,我是例外的新手:)

    • 问题 你想捕获一个异常后抛出另外一个不同的异常,同时还得在异常回溯中保留两个异常的信息。 解决方案 为了链接异常,使用 raise from 语句来代替简单的 raise 语句。 它会让你同时保留两个异常的信息。例如: >>> def example(): ... try: ... int('N/A') ... except ValueError as e:

    • 问题内容: 我有这样的方法: 我想抛出一个内。编译器不允许我这样做,因为不允许将我的方法扔在那里。但是我需要抛出一个的子类来进行测试 (我不能抛出Unchecked)。显然这是一个hack,但我需要进行测试。我尝试过EasyMock,但它也不允许我这样做。任何想法如何做到这一点? 谢谢,肖恩·阮 问题答案: 方法1: Alexey Ragozin的这篇文章介绍了如何使用泛型技巧引发未声明的检查异常