2017-10-04 1 views
0

Dans mon application Play, je le fais dans Module.configure():Est-il possible de bloquer un thread au démarrage de l'application?

bind(classOf[GadgetsReader]).toInstance(GadgetsCsvReader) 
    bind(classOf[Gadgets]).asEagerSingleton() 

Alors, je fais ceci:

@Singleton 
class Gadgets @Inject()(reader: GadgetsReader) { 
    val all:Seq[Gadget] = reader.readGadgets() 
} 

qui se charge de façon synchrone une grande collection de gadgets d'un CSVfile en mémoire au démarrage, en Le fil de rendu d'un jeu.

Je n'ai pas vu de scénario similaire implémenté dans les exemples Play. Je voudrais savoir si ce que je fais est idiomatique Scala & Jouer.

Est-il possible de charger un très gros fichier de manière synchrone de cette manière, étant donné que je ne veux pas que des requêtes soient traitées tant que les données ne sont pas complètement chargées?

Est-ce une bonne chose que j'ai créé une classe Gadgets puis de l'injecter, par opposition à une méthode statique/objet Gadget.all?

Les classes Gadget et Gadgets doivent-elles être sous model?

D'autres commentaires seraient également appréciés.

Répondre

3

Je suppose que cela dépend de la taille, de la rapidité de démarrage, etc. En général, je dirais que oui, même le sharding de cluster d'Akka a (ou du moins, je lis) un appel bloquant qui attend que l'initialisation se termine avant de revenir. Dans votre cas, c'est probablement bien, mais un blocage avec des appels bloquants comme celui-ci signifie généralement faire des E/S, et les E/S peuvent échouer (par exemple, si vous lisez un système de fichiers réseau et que le réseau échoue ?). Donc, parfois, il est préférable de concevoir votre application pour qu'elle soit capable de répondre (peut-être avec un statut non disponible) sans que l'opération soit encore terminée, et de faire cette opération de manière asynchrone, avec des tentatives etc. Mais peut-être que c'est exagéré dans votre cas. Pour répondre à vos autres questions - oui, il est certainement préférable d'injecter Gadgets que d'utiliser un singleton statique, cela signifie que vous pouvez contrôler comment Gadgets est créé (peut-être vous voudrez peut-être l'initialiser différemment dans les tests).

Il est probablement bon d'être dans le package model, mais cela dépend fortement de votre domaine et de son apparence. Je m'injecte déjà GadgetReader;

+0

est-il nécessaire d'injecter à la fois Gadgets et GadgetReader? –