2017-09-01 4 views
1

J'utilise Restlet avec Guice.injecteur de guice getInstance d'instance singleton annotée

Un CachedThreadPool est definded dans mon Guice:

@Provides 
@Singleton 
@Named("name0") 
public ExecutorService provideAutoDisconnectThreadPool() { 
    return Executors.newCachedThreadPool(); 
} 

Voulait arrêter le Threadpool lorsque le serveur est arrête, donc dans mon restlet.Application, j'utilise l'injecteur pour obtenir l'instance:

@Override 
public void stop() throws Exception { 
    LOGGER.info("stopping..."); 
    // shutdown threadPool 
    injector.getInstance(ExecutorService.class).shutdown(); 
    super.stop(); 
    LOGGER.info("stopped"); 
} 

Cependant, le programme a obtenu l'erreur avec:

com.google.inject.ConfigurationException: Guice configuration errors: 

1) No implementation for java.util.concurrent.ExecutorService was bound. 
while locating java.util.concurrent.ExecutorService 

1 error 
at com.google.inject.internal.InjectorImpl.getProvider(InjectorImpl.java:1004) 
at com.google.inject.internal.InjectorImpl.getInstance(InjectorImpl.java:1009) 

Alors, comment puis-je obtenir la instance threadPool lorsque l'application s'arrête.

Répondre

3

Named est un binding annotation, donc la clé d'injection dans ce cas est ExecutorService.classet@Named("name0"):

injector.getInstance(Key.get(ExecutorService.class, Names.named("name0"))) 
+0

qui fonctionne, T getInstance (Key var1) est la solution, thx – RTzhong