0

Ce code est dans app/dossier:Jouer java 2.5 Guice chargement impatient et arrêter crochet ne fonctionne pas

public class GuiceConfiguration extends AbstractModule { 

     @Override 
     protected void configure() { 
      bind(KafkaConnection.class).asEagerSingleton(); 
     } 
    } 


@Singleton 
public class KafkaConnection { 

    public KafkaConnection(){ 
     try { 
      ServiceUtils.startKafka(); 
     } catch (IOException e) { 
      PlayLoggerUtils.logError("[Global]", this.getClass(), e); 
     } 

    } 

    public KafkaConnection(ApplicationLifecycle lifecycle) { 
     lifecycle.addStopHook(() -> { 
      PlayLoggerUtils.logDebug("Kafka shutting down", this.getClass()); 
      ServiceUtils.shutDownKafka(); 
      return CompletableFuture.completedFuture(null); 
     }); 

    } 


} 

En application conf

play.module.enabled += "GuiceConfiguration" 

La classe est en cours d'initialisation que si je l'appelle injecter manette. Il ne se charge pas au démarrage de l'application. Et le crochet d'arrêt n'est pas non plus en cours d'exécution (essayé avec ctrl + d et tue juste sans forcer en mode production).

+0

Je ne sais pas: Ne pas besoin Guice l'annotation @Inject au constructeur? Le fichier application.conf et le fichier GuiceConfiguration me semblent bons. – Kris

+0

Si aucun constructeur n'est annoté avec @Inject, guice prendra celui sans paramètres - donc votre crochet d'arrêt n'est pas enregistré. D'ailleurs, que voulez-vous dire par «appel injecter dans le contrôleur»? – rethab

Répondre

2

Tout d'abord, votre classe ne devrait avoir qu'un seul constructeur. Si une instance est créée avec le constructeur par défaut, elle ne sera définitivement pas enregistrée dans le cycle de vie de l'application.

De plus, il est de bonne pratique de fournir une interface avec une implémentation. KafkaConnection devrait être une interface qui pourrait avoir plusieurs implémentations (vous permet de stocker des choses si nécessaire).

En ce qui concerne le chargement de l'instance, vous utilisez .asEagerSingleton() dans votre module, ainsi que l'annotation @Singleton. Selon le Guice docs:

     PRODUCTION DEVELOPMENT 
.asEagerSingleton() eager   eager 
.in(Singleton.class) eager   lazy 
.in(Scopes.SINGLETON) eager   lazy 
@Singleton   eager   lazy 

@Singleton doit être chargé paresseusement en mode développement. Bien que dans le mode de production, il devrait être chargé avec impatience.

Ainsi, une mise en œuvre de travail (également sur votre environnement de développement) pourrait ressembler à ceci:

public class GuiceConfiguration extends AbstractModule { 

    @Override 
    protected void configure() { 
     bind(KafkaConnection.class).to(DefaultKafkaConnection.class).asEagerSingleton(); 
    } 
} 

public interface KafkaConnection {} 

// No annotation 
public class DefaultKafkaConnection implements KafkaConnection { 

    // No default constructor, but the ApplicationLifecycle needs 
    // to be injected 
    @Inject 
    public KafkaConnection(ApplicationLifecycle lifecycle) { 
     try { 
      ServiceUtils.startKafka(); 
     } catch (IOException e) { 
      PlayLoggerUtils.logError("[Global]", this.getClass(), e); 
     } 
     lifecycle.addStopHook(() -> { 
      PlayLoggerUtils.logDebug("Kafka shutting down", this.getClass()); 
      ServiceUtils.shutDownKafka(); 
      return CompletableFuture.completedFuture(null); 
     }); 

    } 

} 
+0

le crochet d'arrêt fonctionne mais il n'est toujours pas impatient de charger et de produire – surendar