租用提取工作

一旦工作列於提取佇列中,工作站就可以租用這些工作。工作處理完畢後,工作站必須刪除這些工作。

事前準備

重要注意事項

  • 此方法只適用於在標準環境的服務中執行的工作站。
  • 使用提取佇列時,您必須根據處理量來調度工作站的資源。

租用工作

工作排入佇列後,工作站就可透過 leaseTasks() 方法租用一或多個工作。最近使用 add() 新增的工作可能會延遲一小段時間才能透過 leaseTasks() 租用。

當您申請租用時,可以指定要租用的工作數 (上限為 1,000 項工作) 以及租用期間 (以秒為單位,上限為一週)。租用期間必須夠長,才能確保最慢的工作在租期結束前也有時間完成。您可以使用 modifyTaskLease() 修改工作租用。

租用某個工作後,其他工作站就無法再處理該工作。租約到期前,該工作將無法使用。

下列程式碼範例從佇列 pull-queue 中租用 100 個工作一小時:

Java 8

List<TaskHandle> tasks = q.leaseTasks(3600, TimeUnit.SECONDS, numberOfTasksToLease);

Java 7

List<TaskHandle> tasks = q.leaseTasks(3600, TimeUnit.SECONDS, numberOfTasksToLease);

使用工作標記進行批次處理

並非所有的工作都相同,您的程式碼可以「標記」工作,然後依照標記來選取工作。標記的用途和篩選器相同。

Java 8

q.add(
    TaskOptions.Builder.withMethod(TaskOptions.Method.PULL)
        .payload(content.toString())
        .tag("process".getBytes()));

Java 7

q.add(TaskOptions.Builder.withMethod(TaskOptions.Method.PULL)
    .payload(content.toString())
    .tag("process".getBytes()));

然後租用篩選的工作:

Java 8

// Lease only tasks tagged with "process"
List<TaskHandle> tasks =
    q.leaseTasksByTag(3600, TimeUnit.SECONDS, numberOfTasksToLease, "process");
// You can also specify a tag to lease via LeaseOptions passed to leaseTasks.

Java 7

// Lease only tasks tagged with "process"
List<TaskHandle> tasks = q
    .leaseTasksByTag(3600, TimeUnit.SECONDS, numberOfTasksToLease, "process");
// You can also specify a tag to lease via LeaseOptions passed to leaseTasks.

管理輪詢率

會輪詢工作佇列來租用工作的工作站,應能偵測本身嘗試租用工作的速度是否高於佇列所能提供的速度。如果發生這個問題,leaseTasks() 會出現下列幾種例外狀況:


您的程式碼必須能掌握這些例外狀況,停止呼叫 leaseTasks(),並稍後再重試。為了避免此問題發生,在呼叫 leaseTasks() 時,建議您設定較長的遠端程序呼叫 (RPC) 期限。當租用要求傳回空白工作清單時,建議也跟著停止作業。

如果產生出每佇列每秒大於 10 個 LeaseTasks 要求,則只有前 10 個要求會傳回結果。如果要求超過此上限,OK 傳回的結果為零。

在 GCP 主控台上監控工作

如何查看應用程式中所有工作和佇列的相關資訊:

  1. 開啟 GCP 主控台中的「Task Queues」(工作佇列) 頁面,在頁面頂端的選單列中選取 [Pull Queues] (提取佇列) 分頁標籤。

    前往 [提取佇列] 分頁

  2. 按一下您需要的佇列名稱,開啟該佇列的詳細資料頁面。該頁面會隨即顯示所選佇列內的全部工作。

刪除工作

工作站完成工作後,即需從佇列中刪除該項工作。如果在工作站完成工作後,仍可在佇列中看見這些工作,則可能是工作站作業失敗,在這種情況下,該工作會交由其他工作站處理。

您可以使用 deleteTask() 刪除個別工作或工作清單。您必須知道工作名稱,才能刪除工作。您可在 leaseTasks() 傳回的 Task object 中找到工作名稱。

下列程式碼範例呈現了如何刪除佇列中的工作:

本頁內容對您是否有任何幫助?請提供意見:

傳送您對下列選項的寶貴意見...

這個網頁
Java 8 適用的 App Engine 標準環境