gpt4 book ai didi

java - 使用 ActorSystem 和 Guice 时停止时出现异常

转载 作者:行者123 更新时间:2023-12-01 11:19:27 25 4
gpt4 key购买 nike

我正在尝试删除 Play 2.3.x 应用程序中的一些硬编码依赖项,并使用 Guice 来注入(inject)这些依赖项。其中之一是 Akka ActorSystem,我为此创建了一个像这样的提供程序:

public static class ActorSystemProvider implements Provider<ActorSystem> {
@Override public ActorSystem get() {
return Akka.system();
}
}

问题是,当我的 Play 应用程序关闭(通过 Ctrl-C 或终止)时,我会收到这样的异常,并且应用程序被锁定(只有强制终止才会终止它):

Caused by: com.google.inject.ProvisionException: Unable to provision, see the following errors:

1) Error in custom provider, java.lang.IllegalStateException: Can't get ClosableLazy value after it has been closed
while locating guice.Providers$ActorSystemProvider
while locating akka.actor.ActorSystem
for parameter 0 at some.Class.<init>(...)
while locating some.Class

看来在 Actor 系统关闭后,Guice 正在初始化一些类。解决这个问题的唯一方法是使用 try/catch 和模拟的 ActorSystem:

@Override public ActorSystem get() {
ActorSystem sys;
try {
sys = Akka.system();
} catch (Exception e) {
sys = MOCKED_AS;
}
return sys;
}

但是看起来有点丑。有更好的方法通过 Guice 提供 ActorSystem 或使其工作吗?

最佳答案

这是一个很奇怪的问题。我和我的公司目前正在评估 JPPF 和 AKKA,我们已经做好了准备,所以我怀疑我很快就会遇到这个问题。

我的第一个问题是:您是否尝试找出为什么您的代码在关闭时请求 akka 实例?能从源头上解决问题吗?

如果不是,您的生命周期是否只有一个 ActorSystem 实例?如果是这样,您可以告诉 guice 将其绑定(bind)为单例,这样 guice 就会为您缓存该实例。

class YourModule extends Module{

@Override public void configure(){
//...
bind(ActorSystem.class).toInstance(Akka.system());

//or, similarly
bind(ActorSystem.class).asEagerSingleton(); //assumes you've told this injector instance how to get the ActorSystem somewhere else
}

}

假设你不能(我认为作为关闭 Hook 的一部分有人想要当前系统是合理的),你也许可以使用一些显式的提供程序方法来解决这个问题。

class YourModule extends Module{

// configure...

private ActorSystem mostRecentAkkaSystem;

@Provides
public ActorSystem getCurrentActorSystem(){

try{
mostRecentAkkaSystem = Akka.system();
catch(IllegalStateException e){
//do nothing, use cached value
}

return mostRecentAkkaSystem;

//you're also welcome to use an if-else instead of try-catch here,
//if you can find something akin to System.isShuttingDown(),
//but after 5 minutes of googling, I couldn't, and you get a race condition
//if you add your own shutdown hook to do that manually
}
}

如果您正在寻找一种解决方案,可以归结为除了相当野蛮的“缓存该死的东西”之外的解决方案,我认为我帮不了您太多。您可能会考虑将此作为错误报告给 Akka 人员,因为至少他们应该在静态方法周围放置一个 try-catch 来抛出类似 new IllegalStateException("A system can not beprovided while the JVM is shutdown down") 而不是抛出一个 IllegalStateException 来包装一些奇怪的惰性运行时异常。

希望有帮助!

关于java - 使用 ActorSystem 和 Guice 时停止时出现异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31431784/

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