2017-08-24 7 views
1

Je commence à créer un outil de transfert groupé et j'essaie de déterminer comment satisfaire à l'une des exigences. L'idée est qu'un utilisateur téléchargera un fichier CSV et l'outil l'analysera et enverra chaque ligne du fichier CSV dans la file d'attente des tâches en tant que tâche à exécuter. Ensuite, une fois toutes les tâches (relatives à ce fichier CSV spécifique) terminées, un rapport de synthèse sera envoyé à l'utilisateur. J'utilise Google App Engine et, par le passé, j'utilisais la file d'attente des tâches standard pour gérer les tâches. Cependant, avec la file d'attente de tâches standard, il n'y a aucun moyen de savoir quand la file d'attente est terminée, aucun événement n'est déclenché pour déclencher la génération du rapport, donc je ne suis pas sûr de la façon d'y parvenir.Google App Engine - Événement lorsque la file d'attente est terminée

Je l'ai examiné de plus près et je comprends que Google propose également Google PubSub. Ceci est plus sophistiqué et semble plus adapté, mais je ne peux toujours pas savoir comment déclencher et événement quand une file d'attente PubSub est terminée, des idées?

Répondre

2

Semble que vous pourriez utiliser un compteur pour cela. Créez une entité avec une propriété Integer définie sur le nombre de lignes du fichier CSV. Chaque tâche décrémentera le compteur dans une transaction lorsqu'elle aura fini de traiter la ligne (dans une transaction). Une tâche placera le compteur à 0, et cette tâche pourrait déclencher l'événement. Cela pourrait causer trop de conflits si.

Une autre possibilité consiste à faire en sorte que chaque tâche crée une entité d'un type spécifique à la fin du traitement d'une ligne. Vous pouvez ensuite compter le nombre de ces entités pour déterminer quand toutes les lignes ont été traitées.

1

Il pourrait être plus facile d'utiliser l'API The GAE Pipeline, qui prendrait soin de cela comme une partie de base de ses fonctionnalités.

Il y a un bon article qui explique un peu here.

Et une question liée SO qui arrive à parler de la même raison pour passer à cette API et a une excellente réponse: Google AppEngine Pipelines API

je n'y suis pas moi-même encore, mais il est juste une question de temps :)

Il est également possible de mettre en œuvre un schéma pour suivre les tâches connexes en cours d'exécution, voir Figure out group of tasks completion time using TaskQueue and Datastore.

Vous pouvez également vérifier la file d'attente (environ) état, voir Get number of tasks in a named queue?

+0

Merci pour cela. J'utilise PHP cependant et les bibliothèques semblent seulement supporter Java et Python. D'autres idées? – user5331188

0

je faisais face à un problème similaire plus tôt cette semaine et a réussi à trouver une solution agréable pour elle. Ce que j'ai fait, c'est que j'ai créé une colonne supplémentaire dans la table où une tâche insère des données. Et une fois qu'une tâche spécifique est terminée, elle met à jour cette colonne 'task_status' avec 'done', sinon elle est laissée comme valeur par défaut. Ensuite, lorsque l'utilisateur actualise la page ou passe à une URL spécifique ou que vous effectuez un appel AJAX pour interroger l'état de la tâche pour un ID spécifique dans votre table, vous pouvez voir si elle est complète ou non.

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

Vous pouvez également créer une table 'tasks' dans laquelle vous pouvez stocker des colonnes pertinentes au lieu de modifier des tables existantes.

Espérons que cela vous trouve un peu utile.