0

Этот код находится в приложении/папке:Play 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); 
     }); 

    } 


} 

В заявке конф

play.module.enabled += "GuiceConfiguration" 

Класс инициализируется только если я позвоню вводить в контроллер. Это не загрузка при запуске приложения. И стоп-крючок также не выполняется (пробовали с помощью ctrl + d и просто убивали без принуждения в режиме производства).

+0

я не уверен: Есть ли Guice не нужен @Inject аннотации в конструкторе? Application.conf и GuiceConfiguration выглядит хорошо для меня. – Kris

+0

Если конструктор не аннотируется с помощью @Inject, guice примет значение без параметров, поэтому ваш стоп-крючок не зарегистрирован. Кроме того, что вы подразумеваете под «вызовом инъекции в контроллер»? – rethab

ответ

2

Прежде всего, ваш класс должен иметь только один конструктор. Если экземпляр создается с помощью конструктора по умолчанию, он определенно не будет зарегистрирован в жизненном цикле приложения.

Кроме того, хорошей практикой является предоставление интерфейса с реализацией. KafkaConnection должен быть интерфейсом, который может иметь несколько реализаций (позволяет при необходимости заглушить вещи).

Что касается экземпляра, который не загружается с нетерпением, вы используете в своем модуле .asEagerSingleton(), а также аннотацию @Singleton. Согласно 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

стоп-крючок работает, но все же его не увлекает как в dev, так и в производстве – surendar