如何使用 getMetadata() 轮询 asyncBatchAnnotateFilesAsync (Vision API) - Java

问题描述 投票:0回答:1

我正在使用 Google Vision API asyncBatchAnnotateFilesAsync 使用 Java 解析大型 PDF 现在我想每 1 秒轮询一次请求,以使用 getMetadata() 方法检查异步注释请求的当前状态,以进行长时间运行的操作异步调用。

如果我打印(response.GetMetadat()),我会得到以下输出: [状态=待处理,信息=[inputFuture=[com.google.api.core.AbstractApiFuture$InternalSettableFuture@ac76b42[状态=待处理]],函数=[com.google.api.core.ApiFutures$ApiFunctionToGuavaFunction@268aa98c]]]

但我只想捕获 getMetadata() 的状态 (status=PENDING) 部分。我不确定应该在 Java 中声明什么变量数据类型来捕获 getMetadata() 的输出,以便我可以解析它以获取“状态”

java long-polling google-cloud-vision
1个回答
1
投票

OperationFuture.getMetadata()
提供
isDone()
方法来检查批处理作业是否完成。如果作业已完成,该方法返回(布尔值)
true
;如果作业正在运行,则返回
false
。作业完成可能是由于正常终止、异常或取消。请参阅下面的代码示例。

while(!response.getMetadata().isDone()){
    System.out.println("In Progress...");
    TimeUnit.SECONDS.sleep(1); // One second delay
}

但是,如果你想解析返回的protobuf消息,可以使用

toString()
方法。
response.getMetadata().toString()
的输出是一个字符串,可以检查
PENDING
是否作为子字符串存在。

while(response.getMetadata().toString().contains("PENDING")) // Checking if the job is in the pending state.
{
    System.out.println("In Progress...");
    TimeUnit.SECONDS.sleep(1); // One second delay
}

if(response.getMetadata().toString().contains("SUCCESS"))
{
    System.out.println("\nProcess Done!");
}

if(response.getMetadata().toString().contains("FAILURE"))
{
    System.out.println("\nProcess Failed!");
}
© www.soinside.com 2019 - 2024. All rights reserved.