2017-08-24 114 views
1

我开始构建批量上传工具,并试图解决如何完成其​​中一项要求。Google App Engine - 队列结束时的事件

这个想法是,用户将上传一个CSV文件,该工具将解析它,并将CSV的每一行发送到任务队列作为要运行的任务。然后,一旦完成了与该特定CSV文件有关的所有任务,就会向用户发送摘要报告。

我使用的是Google App Engine,过去我使用标准任务队列来处理任务。但是,使用标准任务队列时,无法知道队列何时完成,因此不会触发事件触发报告生成,因此我不知道如何实现此目的?

我仔细研究过它,我知道Google也提供Google PubSub。这更复杂并且看起来更合适,但是我仍然无法找到如何在PubSub队列完成时触发和事件,有什么想法?

回答

2

似乎你可以用这个计数器。使用Integer属性创建一个实体,该实体设置为CSV文件的行数。每个任务将在事务完成处理(在事务中)时递减事务中的计数器。一项任务会将计数器设置为0,并且该任务可能触发事件。尽管如此,这可能会引发太多争论。

另一种可能性可能是让每个任务在完成一行处理时创建特定类型的实体。然后,您可以统计这些实体的数量,以确定何时处理了所有行。

1

使用GAE Pipeline API可能会更容易,GAE Pipeline API会将其作为其功能的基本部分来处理。

有一篇很好的文章解释它here

和相关的SO问题,这恰好提同样的原因移动到这个API并具有优良的答案:Google AppEngine Pipelines API

我没有使用它自己还,但它只是一个时间的问题:)

也有可能实现一个方案来跟踪仍然处于活动状态的相关任务,请参见Figure out group of tasks completion time using TaskQueue and Datastore

你也可以检查队列(近似)的状态,看Get number of tasks in a named queue?

+0

谢谢你。但是我使用PHP,而这些库似乎只支持java和python。任何其他想法? – user5331188

0

本周早些时候我遇到了类似的问题,并设法找到它一个很好的解决方法。我所做的是我创建了一个任务插入数据的表中的额外列。一旦某个特定的任务完成,它会使用'done'更新这个'task_status'列,否则它将被保留为默认的空值。然后,当用户刷新页面或转到特定URL或者执行AJAX调用以查询表中特定ID的任务状态时,可以看到它是否完整。

select * from table where task_status is not null and id = ?; 

您还可以创建一个'任务'表,您可以在其中存储相关列而不是修改现有表。

希望这能找到你一些用处。