Stacktrace 是:java.util.concurrent.TimeoutException:期货在 [5000 毫秒] 后超时
Stacktrace was: java.util.concurrent.TimeoutException: Futures timed out after [5000 milliseconds]
这就是我演员的样子
public final class DiskMonitorActor extends UntypedActor {
private final File assetsDirectory;
private final long thresholdPercentage;
private final LoggingAdapter logging = Logging.getLogger(getContext().system(), this);
public DiskMonitorActor(final File assetsDirectory, final long thresholdPercentage) {
this.assetsDirectory = assetsDirectory;
this.thresholdPercentage = thresholdPercentage;
validateAssetsDirectory();
}
public static Props props(final File assetsDirectory, final long thresholdPercentage) {
return Props.create(new Creator<DiskMonitorActor>() {
private static final long serialVersionUID = 1L;
public DiskMonitorActor create() throws Exception {
return new DiskMonitorActor(assetsDirectory, thresholdPercentage);
}
});
}
private void validateAssetsDirectory() {
if (!assetsDirectory.exists()) {
throw new DiskException(assetsDirectory.getAbsolutePath() + " does not exists");
}
if (!assetsDirectory.isDirectory()) {
throw new DiskException(assetsDirectory.getAbsolutePath() + " is not a directory");
}
if (!assetsDirectory.canRead()) {
throw new DiskException(assetsDirectory.getAbsolutePath() + " does have read permission");
}
}
@Override
public void onReceive(final Object message) throws Exception {
if (message instanceof DiskMonitorMessage) {
logging.info("disk: {}, total space: {}, usable space: {}",
assetsDirectory.getAbsolutePath(),
assetsDirectory.getTotalSpace(),
assetsDirectory.getUsableSpace());
if (isThresholdExceeded()) {
logging.error("Disk full. Available Space {}", assetsDirectory.getFreeSpace());
throw new DiskException("disk capacity reached threshold.");
}
} else {
unhandled(message);
}
}
private boolean isThresholdExceeded() {
final long usedBytes = assetsDirectory.getTotalSpace() - assetsDirectory.getUsableSpace();
final long thresholdBytes = assetsDirectory.getTotalSpace() * thresholdPercentage / 100;
return usedBytes >= thresholdBytes;
}
}
和一个测试
public class DiskMonitorActorTest {
@Mock
private File assetsDirectory;
@Rule
public TestName testName = new TestName();
@Rule
public ExpectedException expectedException = ExpectedException.none();
@Before
public void setUp() throws Exception {
MockitoAnnotations.initMocks(this);
}
@Test
public void testDirectoryDoesNotExists() throws Exception {
when(assetsDirectory.exists()).thenReturn(false);
expectedException.expect(DiskException.class);
expectedException.expectMessage("null does not exists");
getDiskMonitorActor(assetsDirectory, 10L);
}
private DiskMonitorActor getDiskMonitorActor(final File assetsDirectory,
final long threshold) {
final Props props = DiskMonitorActor.props(assetsDirectory, threshold);
final ActorSystem system = ActorSystem.create("system");
final TestActorRef<DiskMonitorActor> actorRef =
TestActorRef.create(system, props, testName.getMethodName());
return actorRef.underlyingActor();
}
}
当我运行这个的时候,我看到了
[ERROR] [04/26/2015 15:51:35.206] [system-akka.actor.default-dispatcher-2] [akka://system/user/testDirectoryDoesNotExists] null does not exists
akka.actor.ActorInitializationException: exception during creation
at akka.actor.ActorInitializationException$.apply(Actor.scala:164)
at akka.actor.ActorCell.create(ActorCell.scala:596)
at akka.actor.ActorCell.invokeAll(ActorCell.scala:456)
at akka.actor.ActorCell.systemInvoke(ActorCell.scala:478)
at akka.dispatch.Mailbox.processAllSystemMessages(Mailbox.scala:279)
at akka.testkit.CallingThreadDispatcher.process(CallingThreadDispatcher.scala:244)
at akka.testkit.CallingThreadDispatcher.runQueue(CallingThreadDispatcher.scala:284)
at akka.testkit.CallingThreadDispatcher.register(CallingThreadDispatcher.scala:153)
at akka.dispatch.MessageDispatcher.attach(AbstractDispatcher.scala:132)
at akka.actor.dungeon.Dispatch$class.start(Dispatch.scala:87)
at akka.actor.ActorCell.start(ActorCell.scala:369)
at akka.testkit.TestActorRef.<init>(TestActorRef.scala:50)
at akka.testkit.TestActorRef$.apply(TestActorRef.scala:141)
at akka.testkit.TestActorRef$.apply(TestActorRef.scala:137)
at akka.testkit.TestActorRef$.create(TestActorRef.scala:160)
at akka.testkit.TestActorRef.create(TestActorRef.scala)
at com.self.monitoring.tenant.DiskMonitorActorTest.getDiskMonitorActor(DiskMonitorActorTest.java:69)
at com.self.monitoring.tenant.DiskMonitorActorTest.testDirectoryDoesNotExists(DiskMonitorActorTest.java:44)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at org.junit.runners.model.FrameworkMethod.runReflectiveCall(FrameworkMethod.java:50)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
at org.junit.rules.ExpectedException$ExpectedExceptionStatement.evaluate(ExpectedException.java:239)
at org.junit.rules.TestWatcher.evaluate(TestWatcher.java:55)
at org.junit.rules.RunRules.evaluate(RunRules.java:20)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
at org.junit.runners.ParentRunner.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access[=13=]0(ParentRunner.java:58)
at org.junit.runners.ParentRunner.evaluate(ParentRunner.java:268)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:78)
at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:212)
at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:68)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:140)
Caused by: com.self.monitoring.tenant.exception.DiskException: null does not exists
at com.self.monitoring.tenant.DiskMonitorActor.validateAssetsDirectory(DiskMonitorActor.java:38)
at com.self.monitoring.tenant.DiskMonitorActor.<init>(DiskMonitorActor.java:23)
at com.self.monitoring.tenant.DiskMonitorActor.create(DiskMonitorActor.java:31)
at com.self.monitoring.tenant.DiskMonitorActor.create(DiskMonitorActor.java:27)
at akka.actor.CreatorConsumer.produce(Props.scala:335)
at akka.actor.Props.newActor(Props.scala:252)
at akka.actor.ActorCell.newActor(ActorCell.scala:552)
at akka.actor.ActorCell.create(ActorCell.scala:578)
... 46 more
[INFO] [04/26/2015 15:51:35.211] [system-akka.actor.default-dispatcher-3] [akka://system/user/testDirectoryDoesNotExists] Message [akka.testkit.TestActorRef$InternalGetActor$] from Actor[akka://system/temp/$a] to TestActor[akka://system/user/testDirectoryDoesNotExists] was not delivered. [1] dead letters encountered. This logging can be turned off or adjusted with configuration settings 'akka.log-dead-letters' and 'akka.log-dead-letters-during-shutdown'.
java.lang.AssertionError:
Expected: (an instance of com.self.monitoring.tenant.exception.DiskException and exception with message a string containing "null does not exists")
but: an instance of com.self.monitoring.tenant.exception.DiskException <java.util.concurrent.TimeoutException: Futures timed out after [5000 milliseconds]> is a java.util.concurrent.TimeoutException
Stacktrace was: java.util.concurrent.TimeoutException: Futures timed out after [5000 milliseconds]
at scala.concurrent.impl.Promise$DefaultPromise.ready(Promise.scala:219)
at scala.concurrent.impl.Promise$DefaultPromise.result(Promise.scala:223)
at scala.concurrent.Await$$anonfun$result.apply(package.scala:116)
at scala.concurrent.BlockContext$DefaultBlockContext$.blockOn(BlockContext.scala:53)
at scala.concurrent.Await$.result(package.scala:116)
at akka.testkit.TestActorRef.underlyingActor(TestActorRef.scala:93)
at com.self.monitoring.tenant.DiskMonitorActorTest.getDiskMonitorActor(DiskMonitorActorTest.java:71)
at com.self.monitoring.tenant.DiskMonitorActorTest.testDirectoryDoesNotExists(DiskMonitorActorTest.java:44)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at org.junit.runners.model.FrameworkMethod.runReflectiveCall(FrameworkMethod.java:50)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
at org.junit.rules.ExpectedException$ExpectedExceptionStatement.evaluate(ExpectedException.java:239)
at org.junit.rules.TestWatcher.evaluate(TestWatcher.java:55)
at org.junit.rules.RunRules.evaluate(RunRules.java:20)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
at org.junit.runners.ParentRunner.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access[=13=]0(ParentRunner.java:58)
at org.junit.runners.ParentRunner.evaluate(ParentRunner.java:268)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:78)
at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:212)
at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:68)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:140)
java.lang.AssertionError:
Expected: (an instance of com.self.monitoring.tenant.exception.DiskException and exception with message a string containing "null does not exists")
but: an instance of com.self.monitoring.tenant.exception.DiskException <java.util.concurrent.TimeoutException: Futures timed out after [5000 milliseconds]> is a java.util.concurrent.TimeoutException
Stacktrace was: java.util.concurrent.TimeoutException: Futures timed out after [5000 milliseconds]
at scala.concurrent.impl.Promise$DefaultPromise.ready(Promise.scala:219)
at scala.concurrent.impl.Promise$DefaultPromise.result(Promise.scala:223)
at scala.concurrent.Await$$anonfun$result.apply(package.scala:116)
at scala.concurrent.BlockContext$DefaultBlockContext$.blockOn(BlockContext.scala:53)
at scala.concurrent.Await$.result(package.scala:116)
at akka.testkit.TestActorRef.underlyingActor(TestActorRef.scala:93)
at com.self.monitoring.tenant.DiskMonitorActorTest.getDiskMonitorActor(DiskMonitorActorTest.java:71)
at com.self.monitoring.tenant.DiskMonitorActorTest.testDirectoryDoesNotExists(DiskMonitorActorTest.java:44)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at org.junit.runners.model.FrameworkMethod.runReflectiveCall(FrameworkMethod.java:50)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
at org.junit.rules.ExpectedException$ExpectedExceptionStatement.evaluate(ExpectedException.java:239)
at org.junit.rules.TestWatcher.evaluate(TestWatcher.java:55)
at org.junit.rules.RunRules.evaluate(RunRules.java:20)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
at org.junit.runners.ParentRunner.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access[=13=]0(ParentRunner.java:58)
at org.junit.runners.ParentRunner.evaluate(ParentRunner.java:268)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:78)
at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:212)
at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:68)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:140)
at org.hamcrest.MatcherAssert.assertThat(MatcherAssert.java:20)
at org.junit.Assert.assertThat(Assert.java:956)
at org.junit.Assert.assertThat(Assert.java:923)
at org.junit.rules.ExpectedException.handleException(ExpectedException.java:252)
at org.junit.rules.ExpectedException.access[=13=]0(ExpectedException.java:106)
at org.junit.rules.ExpectedException$ExpectedExceptionStatement.evaluate(ExpectedException.java:241)
at org.junit.rules.TestWatcher.evaluate(TestWatcher.java:55)
at org.junit.rules.RunRules.evaluate(RunRules.java:20)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
at org.junit.runners.ParentRunner.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access[=13=]0(ParentRunner.java:58)
at org.junit.runners.ParentRunner.evaluate(ParentRunner.java:268)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:78)
at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:212)
at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:68)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:140)
Process finished with exit code 255
我不明白我怎么看到的
Stacktrace was: java.util.concurrent.TimeoutException: Futures timed out after [5000 milliseconds]
工作流程是什么?我以为我的构造函数会抛出有效异常,我应该能够轻松捕获 ActorInitializationException
这是怎么回事?
超时是由 underlyingActor
方法引起的,该方法在 ask
ing for actor 实例时在内部使用 Await.result
。由于您的 actor 永远不会被创建,因此 ask
永远不会满足。
要解决您的问题,您可以在其他演员中创建您的 DiskMonitorActor
演员,从而为 DiskMonitorActor
实例创建父级,然后在创建时发送 Failure
它是 context.parent
(如 here),或者您可以重构 DiskMonitorActor
逻辑,因此在失败后向 DiskMonitorActor
发送消息的任何人都会收到 Failure
消息作为回应(在这种情况下,我会推荐 become
模式,例如,失败和正常状态的不同接收方法)。第二种方法有点复杂,因为您需要决定何时在失败的演员中执行 context.stop(self)
。
解决这个问题的其他方法是通过消息传递目录,而不是通过构造函数,因此您可以用 Failure
然后 context.stop
.
响应它
总之,你的做法有点不对"akkish"。
这就是我演员的样子
public final class DiskMonitorActor extends UntypedActor {
private final File assetsDirectory;
private final long thresholdPercentage;
private final LoggingAdapter logging = Logging.getLogger(getContext().system(), this);
public DiskMonitorActor(final File assetsDirectory, final long thresholdPercentage) {
this.assetsDirectory = assetsDirectory;
this.thresholdPercentage = thresholdPercentage;
validateAssetsDirectory();
}
public static Props props(final File assetsDirectory, final long thresholdPercentage) {
return Props.create(new Creator<DiskMonitorActor>() {
private static final long serialVersionUID = 1L;
public DiskMonitorActor create() throws Exception {
return new DiskMonitorActor(assetsDirectory, thresholdPercentage);
}
});
}
private void validateAssetsDirectory() {
if (!assetsDirectory.exists()) {
throw new DiskException(assetsDirectory.getAbsolutePath() + " does not exists");
}
if (!assetsDirectory.isDirectory()) {
throw new DiskException(assetsDirectory.getAbsolutePath() + " is not a directory");
}
if (!assetsDirectory.canRead()) {
throw new DiskException(assetsDirectory.getAbsolutePath() + " does have read permission");
}
}
@Override
public void onReceive(final Object message) throws Exception {
if (message instanceof DiskMonitorMessage) {
logging.info("disk: {}, total space: {}, usable space: {}",
assetsDirectory.getAbsolutePath(),
assetsDirectory.getTotalSpace(),
assetsDirectory.getUsableSpace());
if (isThresholdExceeded()) {
logging.error("Disk full. Available Space {}", assetsDirectory.getFreeSpace());
throw new DiskException("disk capacity reached threshold.");
}
} else {
unhandled(message);
}
}
private boolean isThresholdExceeded() {
final long usedBytes = assetsDirectory.getTotalSpace() - assetsDirectory.getUsableSpace();
final long thresholdBytes = assetsDirectory.getTotalSpace() * thresholdPercentage / 100;
return usedBytes >= thresholdBytes;
}
}
和一个测试
public class DiskMonitorActorTest {
@Mock
private File assetsDirectory;
@Rule
public TestName testName = new TestName();
@Rule
public ExpectedException expectedException = ExpectedException.none();
@Before
public void setUp() throws Exception {
MockitoAnnotations.initMocks(this);
}
@Test
public void testDirectoryDoesNotExists() throws Exception {
when(assetsDirectory.exists()).thenReturn(false);
expectedException.expect(DiskException.class);
expectedException.expectMessage("null does not exists");
getDiskMonitorActor(assetsDirectory, 10L);
}
private DiskMonitorActor getDiskMonitorActor(final File assetsDirectory,
final long threshold) {
final Props props = DiskMonitorActor.props(assetsDirectory, threshold);
final ActorSystem system = ActorSystem.create("system");
final TestActorRef<DiskMonitorActor> actorRef =
TestActorRef.create(system, props, testName.getMethodName());
return actorRef.underlyingActor();
}
}
当我运行这个的时候,我看到了
[ERROR] [04/26/2015 15:51:35.206] [system-akka.actor.default-dispatcher-2] [akka://system/user/testDirectoryDoesNotExists] null does not exists
akka.actor.ActorInitializationException: exception during creation
at akka.actor.ActorInitializationException$.apply(Actor.scala:164)
at akka.actor.ActorCell.create(ActorCell.scala:596)
at akka.actor.ActorCell.invokeAll(ActorCell.scala:456)
at akka.actor.ActorCell.systemInvoke(ActorCell.scala:478)
at akka.dispatch.Mailbox.processAllSystemMessages(Mailbox.scala:279)
at akka.testkit.CallingThreadDispatcher.process(CallingThreadDispatcher.scala:244)
at akka.testkit.CallingThreadDispatcher.runQueue(CallingThreadDispatcher.scala:284)
at akka.testkit.CallingThreadDispatcher.register(CallingThreadDispatcher.scala:153)
at akka.dispatch.MessageDispatcher.attach(AbstractDispatcher.scala:132)
at akka.actor.dungeon.Dispatch$class.start(Dispatch.scala:87)
at akka.actor.ActorCell.start(ActorCell.scala:369)
at akka.testkit.TestActorRef.<init>(TestActorRef.scala:50)
at akka.testkit.TestActorRef$.apply(TestActorRef.scala:141)
at akka.testkit.TestActorRef$.apply(TestActorRef.scala:137)
at akka.testkit.TestActorRef$.create(TestActorRef.scala:160)
at akka.testkit.TestActorRef.create(TestActorRef.scala)
at com.self.monitoring.tenant.DiskMonitorActorTest.getDiskMonitorActor(DiskMonitorActorTest.java:69)
at com.self.monitoring.tenant.DiskMonitorActorTest.testDirectoryDoesNotExists(DiskMonitorActorTest.java:44)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at org.junit.runners.model.FrameworkMethod.runReflectiveCall(FrameworkMethod.java:50)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
at org.junit.rules.ExpectedException$ExpectedExceptionStatement.evaluate(ExpectedException.java:239)
at org.junit.rules.TestWatcher.evaluate(TestWatcher.java:55)
at org.junit.rules.RunRules.evaluate(RunRules.java:20)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
at org.junit.runners.ParentRunner.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access[=13=]0(ParentRunner.java:58)
at org.junit.runners.ParentRunner.evaluate(ParentRunner.java:268)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:78)
at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:212)
at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:68)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:140)
Caused by: com.self.monitoring.tenant.exception.DiskException: null does not exists
at com.self.monitoring.tenant.DiskMonitorActor.validateAssetsDirectory(DiskMonitorActor.java:38)
at com.self.monitoring.tenant.DiskMonitorActor.<init>(DiskMonitorActor.java:23)
at com.self.monitoring.tenant.DiskMonitorActor.create(DiskMonitorActor.java:31)
at com.self.monitoring.tenant.DiskMonitorActor.create(DiskMonitorActor.java:27)
at akka.actor.CreatorConsumer.produce(Props.scala:335)
at akka.actor.Props.newActor(Props.scala:252)
at akka.actor.ActorCell.newActor(ActorCell.scala:552)
at akka.actor.ActorCell.create(ActorCell.scala:578)
... 46 more
[INFO] [04/26/2015 15:51:35.211] [system-akka.actor.default-dispatcher-3] [akka://system/user/testDirectoryDoesNotExists] Message [akka.testkit.TestActorRef$InternalGetActor$] from Actor[akka://system/temp/$a] to TestActor[akka://system/user/testDirectoryDoesNotExists] was not delivered. [1] dead letters encountered. This logging can be turned off or adjusted with configuration settings 'akka.log-dead-letters' and 'akka.log-dead-letters-during-shutdown'.
java.lang.AssertionError:
Expected: (an instance of com.self.monitoring.tenant.exception.DiskException and exception with message a string containing "null does not exists")
but: an instance of com.self.monitoring.tenant.exception.DiskException <java.util.concurrent.TimeoutException: Futures timed out after [5000 milliseconds]> is a java.util.concurrent.TimeoutException
Stacktrace was: java.util.concurrent.TimeoutException: Futures timed out after [5000 milliseconds]
at scala.concurrent.impl.Promise$DefaultPromise.ready(Promise.scala:219)
at scala.concurrent.impl.Promise$DefaultPromise.result(Promise.scala:223)
at scala.concurrent.Await$$anonfun$result.apply(package.scala:116)
at scala.concurrent.BlockContext$DefaultBlockContext$.blockOn(BlockContext.scala:53)
at scala.concurrent.Await$.result(package.scala:116)
at akka.testkit.TestActorRef.underlyingActor(TestActorRef.scala:93)
at com.self.monitoring.tenant.DiskMonitorActorTest.getDiskMonitorActor(DiskMonitorActorTest.java:71)
at com.self.monitoring.tenant.DiskMonitorActorTest.testDirectoryDoesNotExists(DiskMonitorActorTest.java:44)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at org.junit.runners.model.FrameworkMethod.runReflectiveCall(FrameworkMethod.java:50)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
at org.junit.rules.ExpectedException$ExpectedExceptionStatement.evaluate(ExpectedException.java:239)
at org.junit.rules.TestWatcher.evaluate(TestWatcher.java:55)
at org.junit.rules.RunRules.evaluate(RunRules.java:20)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
at org.junit.runners.ParentRunner.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access[=13=]0(ParentRunner.java:58)
at org.junit.runners.ParentRunner.evaluate(ParentRunner.java:268)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:78)
at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:212)
at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:68)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:140)
java.lang.AssertionError:
Expected: (an instance of com.self.monitoring.tenant.exception.DiskException and exception with message a string containing "null does not exists")
but: an instance of com.self.monitoring.tenant.exception.DiskException <java.util.concurrent.TimeoutException: Futures timed out after [5000 milliseconds]> is a java.util.concurrent.TimeoutException
Stacktrace was: java.util.concurrent.TimeoutException: Futures timed out after [5000 milliseconds]
at scala.concurrent.impl.Promise$DefaultPromise.ready(Promise.scala:219)
at scala.concurrent.impl.Promise$DefaultPromise.result(Promise.scala:223)
at scala.concurrent.Await$$anonfun$result.apply(package.scala:116)
at scala.concurrent.BlockContext$DefaultBlockContext$.blockOn(BlockContext.scala:53)
at scala.concurrent.Await$.result(package.scala:116)
at akka.testkit.TestActorRef.underlyingActor(TestActorRef.scala:93)
at com.self.monitoring.tenant.DiskMonitorActorTest.getDiskMonitorActor(DiskMonitorActorTest.java:71)
at com.self.monitoring.tenant.DiskMonitorActorTest.testDirectoryDoesNotExists(DiskMonitorActorTest.java:44)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at org.junit.runners.model.FrameworkMethod.runReflectiveCall(FrameworkMethod.java:50)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
at org.junit.rules.ExpectedException$ExpectedExceptionStatement.evaluate(ExpectedException.java:239)
at org.junit.rules.TestWatcher.evaluate(TestWatcher.java:55)
at org.junit.rules.RunRules.evaluate(RunRules.java:20)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
at org.junit.runners.ParentRunner.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access[=13=]0(ParentRunner.java:58)
at org.junit.runners.ParentRunner.evaluate(ParentRunner.java:268)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:78)
at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:212)
at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:68)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:140)
at org.hamcrest.MatcherAssert.assertThat(MatcherAssert.java:20)
at org.junit.Assert.assertThat(Assert.java:956)
at org.junit.Assert.assertThat(Assert.java:923)
at org.junit.rules.ExpectedException.handleException(ExpectedException.java:252)
at org.junit.rules.ExpectedException.access[=13=]0(ExpectedException.java:106)
at org.junit.rules.ExpectedException$ExpectedExceptionStatement.evaluate(ExpectedException.java:241)
at org.junit.rules.TestWatcher.evaluate(TestWatcher.java:55)
at org.junit.rules.RunRules.evaluate(RunRules.java:20)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
at org.junit.runners.ParentRunner.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access[=13=]0(ParentRunner.java:58)
at org.junit.runners.ParentRunner.evaluate(ParentRunner.java:268)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:78)
at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:212)
at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:68)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:140)
Process finished with exit code 255
我不明白我怎么看到的
Stacktrace was: java.util.concurrent.TimeoutException: Futures timed out after [5000 milliseconds]
工作流程是什么?我以为我的构造函数会抛出有效异常,我应该能够轻松捕获 ActorInitializationException
这是怎么回事?
超时是由 underlyingActor
方法引起的,该方法在 ask
ing for actor 实例时在内部使用 Await.result
。由于您的 actor 永远不会被创建,因此 ask
永远不会满足。
要解决您的问题,您可以在其他演员中创建您的 DiskMonitorActor
演员,从而为 DiskMonitorActor
实例创建父级,然后在创建时发送 Failure
它是 context.parent
(如 here),或者您可以重构 DiskMonitorActor
逻辑,因此在失败后向 DiskMonitorActor
发送消息的任何人都会收到 Failure
消息作为回应(在这种情况下,我会推荐 become
模式,例如,失败和正常状态的不同接收方法)。第二种方法有点复杂,因为您需要决定何时在失败的演员中执行 context.stop(self)
。
解决这个问题的其他方法是通过消息传递目录,而不是通过构造函数,因此您可以用 Failure
然后 context.stop
.
总之,你的做法有点不对"akkish"。