0

を働いていないフックを停止アプリ/フォルダにあります。プレイのJava 2.5 Guiceの積極的なロードとこのコード

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); 
     }); 

    } 


} 
アプリケーションのconfで

play.module.enabled += "GuiceConfiguration" 

クラスIで注入を呼び出す場合にのみ初期化されていますコントローラ。アプリケーションの起動時にロードされていません。ストップフックも実行されていません(ctrl + dで試して、プロダクションモードでは強制終了しません)。

+0

を:Guiceのコンストラクタに@Injectアノテーションを必要としないのですか? application.confとGuiceConfigurationは私のためによく見えます。 – Kris

+0

コンストラクタに@Injectアノテーションが付いていない場合、guiceはパラメータなしのものを取るので、stopフックは登録されません。また、「コントローラを呼び出す」とはどういう意味ですか? – rethab

答えて

2

まず、クラスにはコンストラクタが1つだけ必要です。インスタンスがデフォルトコンストラクタで作成された場合、アプリケーションライフサイクルに登録されていません。

さらに、インプリメンテーションにインターフェイスを提供することをお勧めします。 KafkaConnectionは、複数の実装を持つことができるインタフェースでなければなりません(必要に応じてスタブすることができます)。

ロードされていないインスタンスに関しては、注釈だけでなく、モジュール内で.asEagerSingleton()を使用します。 Guice docsによると:

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

@Singletonは、開発モードで遅延ロードする必要があります。生産モードでは、積極的にロードする必要があります。

ので(またあなたのdevの環境上の)作業の実装は次のようになります:私はよく分からない

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

stop hookは動作していますが、まだdevとproductionの両方でeagerloadingしていません – surendar

関連する問題