使用任务队列创建实体并不总是被创建

时间:2013-07-12 18:33:12

标签: java google-app-engine task-queue

我有一项任务只是在数据存储区中创建一个实体。我现在将许多任务排队到一个命名的推送队列中并让它运行。完成后,我在日志中看到所有任务请求都已运行。但是,创建的实体数量实际上低于预期。

以下是我用来测试它的代码示例。我运行了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);
}

我已经运行了几次而没有一次看到所有创建的实体。

如果队列中存在太多争用,是否可以丢弃任务? 这是任务队列的预期行为吗?

####编辑

我遵循mitch的建议来记录创建的实体ID,并发现它们确实是按预期创建的。但是日志本身显示了一些奇怪的行为,其中来自某些任务的日志出现在另一个任务的日志中。当发生这种情况时,某些任务会在单个请求中显示2个实体ID。

对于显示2个实体ID的任务,它记录的第一个是数据存储区中缺少的实体。这是否意味着对数据存储区的大量放置存在问题? (我正在创建的实体不是更大的实体组的一部分,即它不引用@parent)

1 个答案:

答案 0 :(得分:0)

为什么不在每次记录新创建的实体的ID的datastore.put()调用之后添加日志语句。然后,您可以将日志与数据存储区内容进行比较,并且您将能够判断问题是否未成功调用datastore.put()1000次,或者问题是某些成功的put调用未导致您在数据存储区中看到的实体。