0

データストアにエンティティを作成するだけのタスクがあります。多くのタスクを名前付きプッシュ キューに入れ、実行させます。完了すると、すべてのタスク リクエストが実行されたことがログに表示されます。ただし、実際には、作成されたエンティティの数は予想よりも少なくなりました。

以下は、これをテストするために使用したコードの例です。10000 のタスクを実行しましたが、最終結果のデータストアには約 9200 のエンティティしかありません。

RestEasy を使用して、タスク キューの URL を公開します。

queue.xml

<queue>
    <name>testQueue</name>
    <rate>5/s</rate>
</queue>

テストコード

@GET
@Path("/queuetest/{numTimes}")
public void queueTest(@PathParam("numTimes") int numTimes) {
    for(int i = 1; i <= numTimes; i++) {
        Queue queue = QueueFactory.getQueue("testQueue");
        TaskOptions taskOptions = TaskOptions.Builder.withUrl("/queuetest/worker/" + i).method(Method.GET);
        queue.add(taskOptions);
    }
}

@GET
@Path("/queuetest/worker/{index}")
public void queueTestWorker(@PathParam("index") String index) {
    DateFormat df = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss");
    Date today = Calendar.getInstance().getTime();        
    String timestamp = df.format(today);

    Entity tObj = new Entity("TestObj");
    tObj.setProperty("identifier", index);
    tObj.setProperty("timestamp", timestamp);

    DatastoreService datastore = DatastoreServiceFactory.getDatastoreService();
    Key key = datastore.put(tObj);
}

これを数回実行しましたが、作成されたすべてのエンティティを見たことは一度もありません。

キューでの競合が多すぎる場合、タスクを破棄できる可能性はありますか? これはタスク キューの予想される動作ですか?

#### 編集

作成されたエンティティ ID をログに記録するというミッチの提案に従い、実際に期待どおりに作成されていることがわかりました。しかし、ログ自体には、一部のタスクのログが別のタスクのログに表示されるという奇妙な動作が見られました。その場合、一部のタスクでは 1 つのリクエストで 2 つのエンティティ ID が表示されます。

2 つのエンティティ ID を表示するタスクの場合、最初にログに記録されるのは、データストアに存在しないエンティティです。これは、データストアへの書き込み回数が多いことに問題があるということですか? (私が作成しているエンティティは、より大きなエンティティ グループの一部ではありません。つまり、@parent を参照していません)

4

1 に答える 1

0

新しく作成されたエンティティの ID をログに記録する各 datastore.put() 呼び出しの後に、ログ ステートメントを追加しないでください。次に、ログをデータストアの内容と比較すると、datastore.put() が 1000 回正常に呼び出されないことが問題なのか、成功した put 呼び出しの一部がデータストアに表示されるエンティティ。

于 2013-07-12T20:25:22.863 に答える