Я новичок в AWS API и пытаюсь запустить пример кода AWS Rekognition (Celebrity Recognition), описанного здесь .Все настройки и учетные данные установлены, и приложение работает.Но он просто застрял в циклической печати:
Waiting for job: c0059a6ee383daf6e6be12c39ee609cfadcbexxxxxxxxxx
....................
....................
....................
И никогда не выйдет.Не уверен, что что-то не так с кодом, конфигурациями или чем-то еще.
В чем проблемы?Почему я не вижу результатов назад?Вот код также в ссылке.
import java.util.List;
import com.amazonaws.services.rekognition.AmazonRekognition;
import com.amazonaws.services.rekognition.AmazonRekognitionClientBuilder;
import com.amazonaws.services.rekognition.model.CelebrityDetail;
import com.amazonaws.services.rekognition.model.CelebrityRecognition;
import com.amazonaws.services.rekognition.model.CelebrityRecognitionSortBy;
import com.amazonaws.services.rekognition.model.GetCelebrityRecognitionRequest;
import com.amazonaws.services.rekognition.model.GetCelebrityRecognitionResult;
import com.amazonaws.services.rekognition.model.NotificationChannel;
import com.amazonaws.services.rekognition.model.S3Object;
import com.amazonaws.services.rekognition.model.StartCelebrityRecognitionRequest;
import com.amazonaws.services.rekognition.model.StartCelebrityRecognitionResult;
import com.amazonaws.services.rekognition.model.Video;
import com.amazonaws.services.rekognition.model.VideoMetadata;
import com.amazonaws.services.sqs.AmazonSQS;
import com.amazonaws.services.sqs.AmazonSQSClientBuilder;
import com.amazonaws.services.sqs.model.Message;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
public class VideoDetectCelebrity {
private static String bucket = "test-bucket";
private static String video = "test.mp4";
private static String queueUrl = "https://sqs.us-east-2.amazonaws.com/xxxx/aws-queue";
private static String topicArn="arn:aws:sns:us-east-2:xxxx:aws-test";
private static String roleArn="arn:aws:iam::xxxxxx:role/aws-test-role";
private static AmazonSQS sqs = null;
private static AmazonRekognition rek = null;
private static NotificationChannel channel= new NotificationChannel()
.withSNSTopicArn(topicArn)
.withRoleArn(roleArn);
private static String startJobId = null;
public static void main(String[] args) throws Exception{
sqs = AmazonSQSClientBuilder.defaultClient();
rek = AmazonRekognitionClientBuilder.defaultClient();
//=================================================
StartCelebrities(bucket, video);
//=================================================
System.out.println("Waiting for job: " + startJobId);
//Poll queue for messages
List<Message> messages=null;
int dotLine=0;
boolean jobFound=false;
//loop until the job status is published. Ignore other messages in queue.
do{
messages = sqs.receiveMessage(queueUrl).getMessages();
if (dotLine++<20){
System.out.print(".");
}else{
System.out.println();
dotLine=0;
}
if (!messages.isEmpty()) {
//Loop through messages received.
for (Message message: messages) {
String notification = message.getBody();
// Get status and job id from notification.
ObjectMapper mapper = new ObjectMapper();
JsonNode jsonMessageTree = mapper.readTree(notification);
JsonNode messageBodyText = jsonMessageTree.get("Message");
ObjectMapper operationResultMapper = new ObjectMapper();
JsonNode jsonResultTree = operationResultMapper.readTree(messageBodyText.textValue());
JsonNode operationJobId = jsonResultTree.get("JobId");
JsonNode operationStatus = jsonResultTree.get("Status");
System.out.println("Job found was " + operationJobId);
// Found job. Get the results and display.
if(operationJobId.asText().equals(startJobId)){
jobFound=true;
System.out.println("Job id: " + operationJobId );
System.out.println("Status : " + operationStatus.toString());
if (operationStatus.asText().equals("SUCCEEDED")){
//============================================
GetResultsCelebrities();
//============================================
}
else{
System.out.println("Video analysis failed");
}
sqs.deleteMessage(queueUrl,message.getReceiptHandle());
}
else{
System.out.println("Job received was not job " + startJobId);
//Delete unknown message. Consider moving message to dead letter queue
sqs.deleteMessage(queueUrl,message.getReceiptHandle());
}
}
}
} while (!jobFound);
System.out.println("Done!");
}
//Copyright 2018 Amazon.com, Inc. or its affiliates. All Rights Reserved.
//PDX-License-Identifier: MIT-0 (For details, see https://github.com/awsdocs/amazon-rekognition-developer-guide/blob/master/LICENSE-SAMPLECODE.)
// Celebrities=====================================================================
private static void StartCelebrities(String bucket, String video) throws Exception{
StartCelebrityRecognitionRequest req = new StartCelebrityRecognitionRequest()
.withVideo(new Video()
.withS3Object(new S3Object()
.withBucket(bucket)
.withName(video)))
.withNotificationChannel(channel);
StartCelebrityRecognitionResult startCelebrityRecognitionResult = rek.startCelebrityRecognition(req);
startJobId=startCelebrityRecognitionResult.getJobId();
}
private static void GetResultsCelebrities() throws Exception{
int maxResults=10;
String paginationToken=null;
GetCelebrityRecognitionResult celebrityRecognitionResult=null;
do{
if (celebrityRecognitionResult !=null){
paginationToken = celebrityRecognitionResult.getNextToken();
}
celebrityRecognitionResult = rek.getCelebrityRecognition(new GetCelebrityRecognitionRequest()
.withJobId(startJobId)
.withNextToken(paginationToken)
.withSortBy(CelebrityRecognitionSortBy.TIMESTAMP)
.withMaxResults(maxResults));
System.out.println("File info for page");
VideoMetadata videoMetaData=celebrityRecognitionResult.getVideoMetadata();
System.out.println("Format: " + videoMetaData.getFormat());
System.out.println("Codec: " + videoMetaData.getCodec());
System.out.println("Duration: " + videoMetaData.getDurationMillis());
System.out.println("FrameRate: " + videoMetaData.getFrameRate());
System.out.println("Job");
System.out.println("Job status: " + celebrityRecognitionResult.getJobStatus());
//Show celebrities
List<CelebrityRecognition> celebs= celebrityRecognitionResult.getCelebrities();
for (CelebrityRecognition celeb: celebs) {
long seconds=celeb.getTimestamp()/1000;
System.out.print("Sec: " + Long.toString(seconds) + " ");
CelebrityDetail details=celeb.getCelebrity();
System.out.println("Name: " + details.getName());
System.out.println("Id: " + details.getId());
System.out.println();
}
} while (celebrityRecognitionResult !=null && celebrityRecognitionResult.getNextToken() != null);
}
}
Глядя на мою панель управления SQS, aws-queue
не имеет доступных сообщений при запуске кода: