0

이 코드를 작동하지 않는 것은 응용 프로그램/폴더에 있습니다 : 응용 프로그램의 conf에서플레이 자바 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); 
     }); 

    } 


} 

play.module.enabled += "GuiceConfiguration" 

하는 클래스는 내가에 주입 호출하는 경우에만 초기화되고 제어 장치. 응용 프로그램 시작시로드되지 않습니다. 그리고 정지 후크도 실행되지 않습니다 (Ctrl + d로 시도하고 프로덕션 모드에서 강제 종료하지 마십시오).

+0

잘 모르겠어요 : Guice 생성자에서 @Inject 주석을 필요로하지 않습니다

그래서 (또한 dev에 환경에) 작동 구현은 다음과 같을 수 있을까? application.conf와 GuiceConfiguration은 나에게 도움이된다. – Kris

+0

@Inject로 주석 처리 된 생성자가 없다면, guice는 매개 변수없이 하나를 취하게되므로 stop hook은 등록되지 않습니다. 게다가, '컨트롤러에 인젝션 콜'이란 무엇을 의미합니까? – rethab

답변

2

우선 클래스에는 생성자가 하나만 있어야합니다. 인스턴스가 기본 생성자를 사용하여 만들어지면 인스턴스가 응용 프로그램 수명주기에 등록되지 않았을 것입니다.

또한 구현과 인터페이스를 제공하는 것이 좋습니다. KafkaConnection은 여러 구현을 가질 수있는 인터페이스 여야합니다 (필요할 때 물건을 스텁 할 수 있음).

열심히로드되지 않는 인스턴스와 관련하여 @Singleton 주석뿐만 아니라 모듈에서 .asEagerSingleton()을 사용합니다. Guice docs에 따르면

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

@Singleton가 개발 모드에서 느리게로드해야합니다. 프로덕션 모드에서는 열심히로드해야합니다.

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

스톱 훅이 작동하지만 여전히 dev 및 프로덕션 모두에서 eagerloading하지 않습니다. – surendar