AWS 转录作业在 lambda returns 后未完成
AWS transcription job does not complete after lambda returns
我正在尝试在 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 秒。
非常感谢您的帮助或指点。
您正在启动 CompletableFuture
,但并未等待它完成。
调用get()
等待它完成执行。
[...]
logger.log("jobResult = " + jobResult.toString());
jobResult.get();
APIGatewayProxyResponseEvent response = new APIGatewayProxyResponseEvent();
[...]
这也解释了为什么当您调用 sleep()
时它会起作用,因为它为 Future 提供了足够的时间来完成。
即使调用仅执行 HTTPS 请求,lambda 也会更快完成(创建 HTTPS 连接的成本很高)。
我正在尝试在 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 秒。 非常感谢您的帮助或指点。
您正在启动 CompletableFuture
,但并未等待它完成。
调用get()
等待它完成执行。
[...]
logger.log("jobResult = " + jobResult.toString());
jobResult.get();
APIGatewayProxyResponseEvent response = new APIGatewayProxyResponseEvent();
[...]
这也解释了为什么当您调用 sleep()
时它会起作用,因为它为 Future 提供了足够的时间来完成。
即使调用仅执行 HTTPS 请求,lambda 也会更快完成(创建 HTTPS 连接的成本很高)。