【问题标题】:AWS transcription job does not complete after lambda returnslambda 返回后 AWS 转录作业未完成
【发布时间】:2020-10-11 16:36:31
【问题描述】:

我正在尝试在 lambda 中启动异步转录作业。我配置了一个 cloudwatch 事件,该事件应在转录作业完成时触发;这样我就可以在不同的 lambda 中对作业完成执行一些操作。 但问题是异步转录作业已成功启动,日志中有以下 jobResult,但作业从未完成,也未触发作业完成事件。

jobResult = java.util.concurrent.CompletableFuture@481a996b[Not completed, 1 dependents]

我的代码在以下几行 -

public class APIGatewayTranscriptHandler implements RequestHandler<APIGatewayProxyRequestEvent, APIGatewayProxyResponseEvent> {

    public APIGatewayProxyResponseEvent handleRequest(APIGatewayProxyRequestEvent event, Context context) {
        S3Client s3Client = S3Client.create();
        String fileUrl = s3Client.utilities().getUrl(GetUrlRequest.builder().bucket("srcBucket").key("fileName").build()).toString();
        Media media = Media.builder().mediaFileUri(fileUrl).build();

        StartTranscriptionJobRequest request = StartTranscriptionJobRequest.builder().
                languageCode(LanguageCode.ES_ES)
                .media(media).outputBucketName("destBucket")
                .transcriptionJobName("jobName")
                .mediaFormat("mp3")
                .settings(Settings.builder().showSpeakerLabels(true).maxSpeakerLabels(2).build())
                .build();

        TranscribeAsyncClient transcribeAsyncClient = TranscribeAsyncClient.create();
        CompletableFuture<StartTranscriptionJobResponse> jobResult = transcribeAsyncClient.startTranscriptionJob(request);
        logger.log("jobResult =  " + jobResult.toString());
        
        jobResult.whenComplete((jobResponse, err) -> {
            try {
                if (jobResponse != null) {
                    logger.log("CompletableFuture : response = " + jobResponse.toString());
                } else {
                    logger.log("CompletableFuture : NULL response: error = " + err.getMessage());
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        });

        //Job is completed only if Thread is made to sleep
        /*try {
                Thread.sleep(50000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }*/

        APIGatewayProxyResponseEvent response = new APIGatewayProxyResponseEvent();
        response.setStatusCode(200);
        Map<String, String> responseBody = new HashMap<String, String>();
        responseBody.put("Status", jobResult.toString());
        String responseBodyString = new JSONObject(responseBody).toJSONString();
        response.setBody(responseBodyString);
        return response;
    }
}

我已经验证,音频文件存在于源桶中。

仅当我在启动作业后在 lambda 中添加一些睡眠时间时,才会触发上述作业并触发作业完成事件。
例如,

Thread.sleep(50000);

如果添加睡眠时间,一切都会按预期工作。 但是如果没有 Thread.sleep(),这项工作永远不会完成。 lambda 的超时配置为 60 秒。 一些帮助或指点将不胜感激。

【问题讨论】:

    标签: java aws-lambda aws-transcribe


    【解决方案1】:

    您正在启动CompletableFuture,但没有等待它完成。

    调用get() 等待它完成执行。

            [...]
            logger.log("jobResult =  " + jobResult.toString());
            jobResult.get();
    
            APIGatewayProxyResponseEvent response = new APIGatewayProxyResponseEvent();
            [...]
    

    这也解释了为什么当您调用 sleep() 时它会起作用,因为它为 Future 提供了足够的时间来完成。

    即使调用仅执行 HTTPS 请求,lambda 也会更快完成(HTTPS 连接的创建成本很高)。

    【讨论】:

    • 其实我在用 jobResult.whenComplete((jobResponse, err)) 在代码中等待作业完成。我已经用附加代码更新了我的问题。但是我正在启动一个异步作业,并且不应该需要 lambda 来等待作业完成。根据输入音频的大小,旁边的作业可能需要大量时间,并且 lambda 可能会在作业完成之前超时。 AWS lambda 的最大超时时间为 15 分钟。
    • 不是等待工作完成。只是等待作业提交whenComplete 在提交作业之前也不会暂停,而是在完成时将操作排入队列。您的代码将操作排入队列以向 AWS 服务发送消息,但 lambda 随后到达执行结束,甚至没有时间在您使用异步客户端时将请求实际发送到服务器。按照我的建议尝试拨打get()。 lambda 将花费几分之一秒的时间来执行,一切都会好起来的。
    • 我会尝试调用 get() 并返回结果
    • 实际上您的建议似乎有效。非常感谢。 aws 文档或示例均未提及在启动作业后调用 get()。我会做更多的测试来确认。再次感谢。
    • 这不是 AWS 的事情,而是关于 CompletableFuture 如何与 JVM 在 HTTPS 请求有时间发送之前终止这一事实一起工作的 Java 功能。可能有用的是更多地了解它在 Java 上的工作原理。 Angelika Langer 的精彩演讲我怎么推荐都不够:youtube.com/watch?v=Q_0_1mKTlnY
    猜你喜欢
    • 1970-01-01
    • 2020-10-09
    • 2019-04-03
    • 2020-04-16
    • 1970-01-01
    • 1970-01-01
    • 2020-01-04
    • 1970-01-01
    • 2022-01-15
    相关资源
    最近更新 更多