7
votes

Quelle est la meilleure façon de créer une file d'attente pour des travaux de longue date dans une application Grails?

J'ai une application GRAVES qui possède certaines optimisations intensives de calcul avec une durée de fonctionnement d'environ 5 minutes (peut-être plus). Actuellement, je les fais dans le fil de la demande principale, c'est-à-dire 5 minutes pour la demande de retour. Cela fonctionne, mais est bien sûr horrible d'une perspective de convivialité.

Alors, quel est le meilleur moyen de mettre en œuvre cela de manière asynchrone? Je suppose qu'un threadpoolexecutteur devrait être impliqué, mais comment puis-je commencer et y accéder? Puis-je le modeler comme un service Grails? Ou un travail (semble que ce sont seulement destinés à des travaux récurrents)?

Aussi, quel est le meilleur moyen de gérer le statut de travail? Via un drapeau ou peut-être une nouvelle classe dans la DB? Demandez au navigateur d'afficher une fileuse et continuez à interroger jusqu'à ce que le statut change?


0 commentaires

6 Réponses :


3
votes

Il y a un plugin Fil de fond qui pourrait être ce que vous recherchez .

Bien sûr, il serait possible de rouler votre propre mise en commun de fil ou d'utiliser des trucs Java existants.


0 commentaires

3
votes

J'utiliserais les grails JMS Plugin pour cela.

Ensuite, vous pouvez créer un service avec une méthode "OnMessage" qui interagit automatiquement avec un fournisseur JMS sous-jacent (comme OpenMQ ou Activemq .

Cela rend ce genre de chose assez facile.


3 commentaires

Quel serait l'avantage comparé à simplement utiliser un threadpoolexecutor? Cela semble beaucoup plus complexe que cela.


C'est vraiment plus complexe. Les principaux avantages seraient autour de certaines des capacités de surveillance et de vote que votre question a fait allusion à certaines exigences. Beaucoup de ce genre de choses sont résolus dans le monde JMS, mais il y a plus de configuration / de maintenance autour de lui. Cela dépend vraiment de la manière dont vos exigences "Enterprisey" sont. Si vous ne vous souciez pas beaucoup de la surveillance ou de ce qui se passe si votre conteneur diminue pendant son traitement, je ferais simplement quelque chose de plus simple. Juste une option potentielle.


Ah, je vois. Eh bien, la seule surveillance que j'ai besoin concerne un utilisateur en attente d'un travail spécifique à compléter. Je n'ai pas besoin de sécurité transactionnelle non plus, je vais donc aller pour une approche plus simple.



2
votes

Dans l'esprit de la "chose la plus simple qui pourrait éventuellement travailler" J'ai fait quelque chose comme celui-ci comme un simple service. (Bien sûr, il pourrait être trop simple, la critique est la bienvenue).

J'ai utilisé la fonctionnalité de Groovy que le fil a une méthode de début statique qui prend une fermeture. Voir http://groovy.codehaus.org/groovy-jdk/java /lang/thread.html

J'ai implémenté une méthode sur un service qui ressemblait à: xxx


0 commentaires

1
votes

grails install-plugin arrière-plan-fil

def arrière-plans def

fond d'arrière-plan.execute ("faire mon truc", {

// fonctionne ici

});


0 commentaires

3
votes

Le plug-in fond-thread n'est pas obsolète pour que je ne recommanderais pas l'utilisation et que le JMS semble survenir pour le traitement des antécédents. JMS est plus d'une file d'attente de message plutôt que d'un utilitaire de traitement de fond.

Je recommanderais soit d'utiliser le plugin de quartz ou à l'aide des GPAR.


0 commentaires

1
votes

Cela fait longtemps que cela a été demandé, mais comme il venait de trouver une recherche, je pensais que j'ajouterais qu'il y a maintenant une fermeture de filetage groovy dans l'objet de fil. Vous utilisez simplement:

Thread.start {
    // async code goes here
}


0 commentaires