- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试删除 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/
我有一个问题,多次执行 ActorSystem system = ActorSystem.create("System"); 是否会提高生产力,或者我必须执行一次并使用一个引用? 最佳答案 您应该仅创
我们使用的是 Akka 2.0 RC1,在创建 ActorSystem 时出现异常,消息为:akka.actor.LocalActorRefProvider,堆栈跟踪如下: java.net.URLC
我需要一个 ActorSystem这不会记录任何内容。用spray尝试HTTP的东西,我太笨了,忍不住复制粘贴他们的示例代码here .正如你所看到的,他们正在使用 ActorSystem ,其默认配
我需要将不同类型的消息发布到事件流,而那些 消息应该有不同的优先级,例如,如果 10 个类型的消息 A 已经发布了,毕竟发布了一条类型 B 的消息,并且 B 的优先级高于 A 的优先级 - 消息 B
Akka 2.x 需要许多命令来引用 ActorSystem。因此,要创建 Actor MyActor 的实例,您可能会说: val system = ActorSystem() val myActo
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 9 年前。 Improve th
我将 Spray 用于 REST 端点。如何访问 trait 中现有的 ActorSystem? 我不想在我的 trait 中创建一个新的 ActorSystem(如果可能的话),而是重用我现有的 A
我正在尝试使用测试套件对我的 Java Akka actor 进行单元测试 public class AggregationActor extends UntypedActor { final
是否可以向 Actor 系统中的所有 Actor 发送消息?我一直在看Broadcast router例如,但这太边缘了,我无法理解我如何动态地向路由器添加 Actor 。 我们正在为 akka 使用
我有一个主程序,它创建一个 ActorSystem,一个 Actor 并向 Actor 发送一些消息。处理消息后,我发送 PoisonPill 来杀死 Actor。然后我关闭了 Actor 系统。 在
在 Akka (scala) 中是否可以获取对现有 ActorSystem 的引用? 我正在与 DB 的另一个 Actor 一起开发 Spray 应用程序。我还扩展了指令以让每个路径都有一个对象。这些
我正在开发一项使用 Akka Persistence 进行事件溯源的服务。到目前为止,我们已经成功地将事件存储在 Cassandra 日志中。现在我们想利用 Akka Persistence Quer
我正在尝试删除 Play 2.3.x 应用程序中的一些硬编码依赖项,并使用 Guice 来注入(inject)这些依赖项。其中之一是 Akka ActorSystem,我为此创建了一个像这样的提供程序
根据documentation对于 Play 2.6: The deprecated static methods play.libs.Akka.system and play.api.libs.co
我在 Java 8 中使用 Akka 2.5.6,我想知道完成 ActorSystem 的正确方法,我的代码的部分功能是处理一些 XML 文件并验证它们,为了实现这一点,我创建了 3 个 actor:
我有一个代码,我在其中从 AkkaSystem 创建一个 Actor。 return system.actorOf(Props.apply(new Creator() .... 里面我叫的童星 con
intellij 在子类指定更具体的返回类型时存在问题。 Akka 的 Http.get(ActorSystem) 方法就是这种情况。这个问题已报告给 JB,但他们尚未回复。 SCL-12302 最佳
我目前正在烘烤我的第一个蛋糕图案,所以请多多包涵。 我拿了我的工作单体应用程序,并将其切割成功能层。剪切看起来很干净,但导致两个层依赖于隐式 ActorSystem。 我试图像这样解决这种依赖关系:
我正在将我的项目升级到 Play 2.5。在之前的版本中,我使用以下代码通过 Akka 来调度任务: private ActorSystem actorSystem = Play.current().
我正在为 C# 桌面应用程序(不是服务器,而是桌面 GUI 应用程序)编写插件。为了使我们的线程问题更简单,我正在研究是否可以在这些插件中使用 AKKA.NET。这些插件基本上彼此独立。因此,从架构
我是一名优秀的程序员,十分优秀!