gpt4 book ai didi

java - 玩java 2.5 guice急切加载并停止钩子(Hook)不工作

转载 作者:行者123 更新时间:2023-12-02 03:31:08 25 4
gpt4 key购买 nike

此代码位于 app/文件夹中:

 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"

仅当我在 Controller 中调用注入(inject)时,该类才会被初始化。它不会在应用程序启动时加载。并且停止钩子(Hook)也没有被执行(尝试使用 ctrl+d 并在生产模式下不强制杀死)。

最佳答案

首先,你的类应该只有一个构造函数。如果使用默认构造函数创建实例,它肯定不会注册到应用程序生命周期。

此外,提供带有实现的接口(interface)是一种很好的做法。 KafkaConnection 应该是一个可以有多个实现的接口(interface)(允许您在必要时 stub )。

对于不立即加载实例,您可以在模块中使用 .asEagerSingleton() 以及 @Singleton 注释。根据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);
});

}

}

关于java - 玩java 2.5 guice急切加载并停止钩子(Hook)不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38072543/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com