Akka 运行中的异常处理
我有一个工人师傅,他有一个监工来监督他的童工。 子工作者抛出一个IOException,该IOException由父工作者查看,然后父工作者调用SupervisorStartegy的resume()方法 到目前为止,exoption被抛出,异常被转移到父级,父级调用resume,但在此之后,我得到一个超时异常Akka 运行中的异常处理,akka,Akka,我有一个工人师傅,他有一个监工来监督他的童工。 子工作者抛出一个IOException,该IOException由父工作者查看,然后父工作者调用SupervisorStartegy的resume()方法 到目前为止,exoption被抛出,异常被转移到父级,父级调用resume,但在此之后,我得到一个超时异常 public class EmailServiceActor extends UntypedActor{ ActorRef actorRef ; private static Super
public class EmailServiceActor extends UntypedActor{
ActorRef actorRef ;
private static SupervisorStrategy strategy =
new OneForOneStrategy(3, Duration.create("1 minute"),
new Function<Throwable, Directive>() {
@Override
public Directive apply(Throwable t) {
if (t instanceof IOException) {
System.out.println("IO Exception occurred");
return restart();
} else if (t instanceof Exception) {
return stop();
} else {
return escalate();
}
}
});
@Override
public void onReceive(Object message) {
System.out.println("Received .....");
if(message instanceof MyLocalMessage){
System.out.println("received instr from EmailServiceWorker by EmailServiceActor");
actorRef.tell(message, self());
}else{
actorRef = getSender();
System.out.println("received instr by EmailServiceActor from Application");
getContext().actorOf(Props.create(EmailServiceWorker.class),"EmailServiceWorker").tell(message, self());
}
}
@Override
public SupervisorStrategy supervisorStrategy() {
return strategy;
}
@Override
public void preStart() {
System.out.println("Pre Restart...");
}
}
没有“someFile”这样的文件。我故意试图提出这个错误
控制器如下所示
公共类应用程序扩展控制器{
//We need the ActorSystem to host our actors as well as to send and receive messages
static ActorSystem actorSystem = ActorSystem.create( "play" );
static {
// Create our local actors
actorSystem.actorOf( Props.create( MainActor.class ), "MainActor" );
actorSystem.actorOf( Props.create( EmailServiceActor.class ), "EmailServiceActor" );
}
public static Result index() {
return ok(index.render("Your new application is ready."));
}
@SuppressWarnings("unchecked")
public static Promise<Result> localHello( String name )
{
// Look up the actor
ActorSelection myActor =
actorSystem.actorSelection( "user/MainActor" );
// Connstruct our message
MyMessage message = new MyMessage( name );
// As the actor for a response to the message (and a 30 second timeout);
// ask returns an Akka Future, so we wrap it with a Play Promise
Future future = ask(myActor, message, 30000);
Promise promiseValue = Promise.wrap(future);
Function<Object, Result> function = new Function<Object, Result>() {
public Result apply(Object response) {
if( response instanceof MyLocalMessage ) {
MyLocalMessage message = ( MyLocalMessage )response;
return ok( message.getMessage() );
}
return notFound( "Message is not of type MyMessage" );
}
};
Promise<Result> promiseResult = promiseValue.map(function);
return promiseResult;
}
public static Promise<Result> sendMail(){
ActorSelection emailActor = actorSystem.actorSelection("user/EmailServiceActor");
Future future = ask(emailActor,"Hello",190000);
// Look up the actor
Promise promiseValue = Promise.wrap(future);
Function<Object, Result> function = new Function<Object, Result>(){
public Result apply(Object response) {
return ok("Email is being sent");
}
};
Promise<Result> promiseResult = promiseValue.map(function);
return promiseResult;
}
}
//我们需要ActorSystem来承载我们的参与者以及发送和接收消息
静态ActorSystem ActorSystem=ActorSystem.create(“播放”);
静止的{
//创造本地演员
actorSystem.actorOf(Props.create(MainActor.class),“MainActor”);
actorSystem.actorOf(Props.create(EmailServiceActor.class),“EmailServiceActor”);
}
公共静态结果索引(){
返回ok(index.render(“新应用程序准备就绪”);
}
@抑制警告(“未选中”)
公共静态承诺localHello(字符串名称)
{
//看上演员
Actor选择myActor=
actorSystem.actorSelection(“用户/主参与者”);
//解读我们的信息
MyMessage message=新的MyMessage(名称);
//作为响应消息的参与者(以及30秒超时);
//ask返回一个Akka未来,所以我们用游戏承诺来包装它
Future=ask(myActor,message,30000);
承诺价值=承诺包装(未来);
函数=新函数(){
公共结果应用(对象响应){
if(MyLocalMessage的响应实例){
MyLocalMessage消息=(MyLocalMessage)响应;
返回ok(message.getMessage());
}
return notFound(“消息不是MyMessage类型”);
}
};
promiseResult=promiseValue.map(函数);
回报承诺;
}
公共静态承诺sendMail(){
ActorSelectionEmailActor=actorSystem.ActorSelection(“用户/EmailServiceActor”);
Future=ask(emailActor,“你好”,190000);
//看上演员
承诺价值=承诺包装(未来);
函数=新函数(){
公共结果应用(对象响应){
返回ok(“正在发送电子邮件”);
}
};
promiseResult=promiseValue.map(函数);
回报承诺;
}
}
但是当我运行应用程序时,我得到了错误
Pre Restart...
Received .....
received instr by EmailServiceActor from Application
Pre Restart
received instr by EmailServiceWorker
Sending mail
IO Exception occurred
Pre Restart
[ERROR] [08/12/2014 10:53:13.844] [play-akka.actor.default-dispatcher-5] [akka://play/user/EmailServiceActor/EmailServiceWorker] someFile (No such file or directory)
java.io.FileNotFoundException: someFile (No such file or directory)
at java.io.FileInputStream.open(Native Method)
at java.io.FileInputStream.<init>(FileInputStream.java:146)
at java.io.FileInputStream.<init>(FileInputStream.java:101)
at java.io.FileReader.<init>(FileReader.java:58)
at actors.EmailServiceWorker.onReceive(EmailServiceWorker.java:18)
at akka.actor.UntypedActor$$anonfun$receive$1.applyOrElse(UntypedActor.scala:167)
at akka.actor.Actor$class.aroundReceive(Actor.scala:465)
at akka.actor.UntypedActor.aroundReceive(UntypedActor.scala:97)
at akka.actor.ActorCell.receiveMessage(ActorCell.scala:516)
at akka.actor.ActorCell.invoke(ActorCell.scala:487)
at akka.dispatch.Mailbox.processMailbox(Mailbox.scala:238)
at akka.dispatch.Mailbox.run(Mailbox.scala:220)
at akka.dispatch.ForkJoinExecutorConfigurator$AkkaForkJoinTask.exec(AbstractDispatcher.scala:393)
at scala.concurrent.forkjoin.ForkJoinTask.doExec(ForkJoinTask.java:260)
at scala.concurrent.forkjoin.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1339)
at scala.concurrent.forkjoin.ForkJoinPool.runWorker(ForkJoinPool.java:1979)
at scala.concurrent.forkjoin.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:107)
[error] play - Cannot invoke the action, eventually got an error: akka.pattern.AskTimeoutException: Ask timed out on [ActorSelection[Anchor(akka://play/), Path(/user/EmailServiceActor)]] after [190000 ms]
[error] application -
! @6j77j81fk - Internal server error, for (GET) [/sendmail] ->
play.api.Application$$anon$1: Execution exception[[AskTimeoutException: Ask timed out on [ActorSelection[Anchor(akka://play/), Path(/user/EmailServiceActor)]] after [190000 ms]]]
at play.api.Application$class.handleError(Application.scala:296) ~[play_2.11-2.3.2.jar:2.3.2]
at play.api.DefaultApplication.handleError(Application.scala:402) [play_2.11-2.3.2.jar:2.3.2]
at play.core.server.netty.PlayDefaultUpstreamHandler$$anonfun$3$$anonfun$applyOrElse$4.apply(PlayDefaultUpstreamHandler.scala:320) [play_2.11-2.3.2.jar:2.3.2]
at play.core.server.netty.PlayDefaultUpstreamHandler$$anonfun$3$$anonfun$applyOrElse$4.apply(PlayDefaultUpstreamHandler.scala:320) [play_2.11-2.3.2.jar:2.3.2]
at scala.Option.map(Option.scala:145) [scala-library-2.11.1.jar:na]
Caused by: akka.pattern.AskTimeoutException: Ask timed out on [ActorSelection[Anchor(akka://play/), Path(/user/EmailServiceActor)]] after [190000 ms]
at akka.pattern.PromiseActorRef$$anonfun$1.apply$mcV$sp(AskSupport.scala:333) ~[akka-actor_2.11-2.3.4.jar:na]
at akka.actor.Scheduler$$anon$7.run(Scheduler.scala:117) ~[akka-actor_2.11-2.3.4.jar:na]
at scala.concurrent.Future$InternalCallbackExecutor$.unbatchedExecute(Future.scala:599) ~[scala-library-2.11.1.jar:na]
at scala.concurrent.BatchingExecutor$class.execute(BatchingExecutor.scala:109) ~[scala-library-2.11.1.jar:na]
at scala.concurrent.Future$InternalCallbackExecutor$.execute(Future.scala:597) ~[scala-library-2.11.1.jar:na]
重新启动前。。。
收到。。。。。
EmailServiceActor从应用程序收到instr
重新启动前
由EmailServiceWorker接收指令
发送邮件
发生IO异常
重新启动前
[错误][08/12/2014 10:53:13.844][播放akka.actor.default-dispatcher-5][akka://play/user/EmailServiceActor/EmailServiceWorker]someFile(没有这样的文件或目录)
java.io.FileNotFoundException:someFile(没有这样的文件或目录)
在java.io.FileInputStream.open(本机方法)
位于java.io.FileInputStream。(FileInputStream.java:146)
位于java.io.FileInputStream。(FileInputStream.java:101)
位于java.io.FileReader。(FileReader.java:58)
位于actors.EmailServiceWorker.onReceive(EmailServiceWorker.java:18)
在akka.actor.UntypedActor$$anonfun$receive$1.applyOrElse(UntypedActor.scala:167)
在akka.actor.actor$class.aroundReceive(actor.scala:465)
在akka.actor.UntypedActor.aroundReceive(UntypedActor.scala:97)
在akka.actor.ActorCell.receiveMessage(ActorCell.scala:516)
在akka.actor.ActorCell.invoke(ActorCell.scala:487)
在akka.dispatch.Mailbox.processMailbox(Mailbox.scala:238)
在akka.dispatch.Mailbox.run(Mailbox.scala:220)
在akka.dispatch.ForkJoinExecutorConfigurator$AkkaForkJoinTask.exec(AbstractDispatcher.scala:393)
位于scala.concurrent.forkjoin.ForkJoinTask.doExec(ForkJoinTask.java:260)
位于scala.concurrent.forkjoin.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1339)
位于scala.concurrent.forkjoin.ForkJoinPool.runWorker(ForkJoinPool.java:1979)
在scala.concurrent.forkjoin.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:107)中
[错误]播放-无法调用该操作,最终出现错误:akka.pattern.AskTimeoutException:Ask在[ActorSelection[Anchor]上超时(akka://play/),路径(/user/EmailServiceActor)],在[190000毫秒]之后
[错误]应用程序-
! @6j77j81fk-内部服务器错误,用于(GET)[/sendmail]->
play.api.Application$$anon$1:执行异常[[AskTimeoutException:Ask在[ActorSelection[Anchor]上超时(akka://play/),路径(/user/EmailServiceActor)],在[190000毫秒]]]之后
在play.api.Application$class.handleError(Application.scala:296)~[play_2.11-2.3.2.jar:2.3.2]
play.api.DefaultApplication.handleError(Application.scala:402)[play_2.11-2.3.2.jar:2.3.2]
在play.core.server.netty.playdaultUpstreamHandler$$anonfun$3$$anonfun$applyOrElse$4.apply(playdaultUpstreamHandler.scala:320)[play_2.11-2.3.2.jar:2.3.2]
在play.core.server.netty.playdaultUpstreamHandler$$anonfun$3$$anonfun$applyOrElse$4.apply(playdaultUpstreamHandler.scala:320)[play_2.11-2.3.2.jar:2.3.2]
在scala.Option.map(Option.scala:145)[scala-library-2.11.1.jar:na]
原因:akka.pattern.AskTimeoutException:Ask在[ActorSelection]上超时[Anchor](akka://play/),路径(/user/EmailServiceActor)],在[190000毫秒]之后
在akka.pattern.PromiseActorRef$$anonfun$1.apply$mcV$sp(AskSupport.scala:333)~[akka-actor_2.11-2.3.4.jar:na]
在akka.actor.Scheduler$$anon$7.run(Scheduler.scala:117)~[akka-actor_2.11-2.3.4.jar:na]
在
Pre Restart...
Received .....
received instr by EmailServiceActor from Application
Pre Restart
received instr by EmailServiceWorker
Sending mail
IO Exception occurred
Pre Restart
[ERROR] [08/12/2014 10:53:13.844] [play-akka.actor.default-dispatcher-5] [akka://play/user/EmailServiceActor/EmailServiceWorker] someFile (No such file or directory)
java.io.FileNotFoundException: someFile (No such file or directory)
at java.io.FileInputStream.open(Native Method)
at java.io.FileInputStream.<init>(FileInputStream.java:146)
at java.io.FileInputStream.<init>(FileInputStream.java:101)
at java.io.FileReader.<init>(FileReader.java:58)
at actors.EmailServiceWorker.onReceive(EmailServiceWorker.java:18)
at akka.actor.UntypedActor$$anonfun$receive$1.applyOrElse(UntypedActor.scala:167)
at akka.actor.Actor$class.aroundReceive(Actor.scala:465)
at akka.actor.UntypedActor.aroundReceive(UntypedActor.scala:97)
at akka.actor.ActorCell.receiveMessage(ActorCell.scala:516)
at akka.actor.ActorCell.invoke(ActorCell.scala:487)
at akka.dispatch.Mailbox.processMailbox(Mailbox.scala:238)
at akka.dispatch.Mailbox.run(Mailbox.scala:220)
at akka.dispatch.ForkJoinExecutorConfigurator$AkkaForkJoinTask.exec(AbstractDispatcher.scala:393)
at scala.concurrent.forkjoin.ForkJoinTask.doExec(ForkJoinTask.java:260)
at scala.concurrent.forkjoin.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1339)
at scala.concurrent.forkjoin.ForkJoinPool.runWorker(ForkJoinPool.java:1979)
at scala.concurrent.forkjoin.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:107)
[error] play - Cannot invoke the action, eventually got an error: akka.pattern.AskTimeoutException: Ask timed out on [ActorSelection[Anchor(akka://play/), Path(/user/EmailServiceActor)]] after [190000 ms]
[error] application -
! @6j77j81fk - Internal server error, for (GET) [/sendmail] ->
play.api.Application$$anon$1: Execution exception[[AskTimeoutException: Ask timed out on [ActorSelection[Anchor(akka://play/), Path(/user/EmailServiceActor)]] after [190000 ms]]]
at play.api.Application$class.handleError(Application.scala:296) ~[play_2.11-2.3.2.jar:2.3.2]
at play.api.DefaultApplication.handleError(Application.scala:402) [play_2.11-2.3.2.jar:2.3.2]
at play.core.server.netty.PlayDefaultUpstreamHandler$$anonfun$3$$anonfun$applyOrElse$4.apply(PlayDefaultUpstreamHandler.scala:320) [play_2.11-2.3.2.jar:2.3.2]
at play.core.server.netty.PlayDefaultUpstreamHandler$$anonfun$3$$anonfun$applyOrElse$4.apply(PlayDefaultUpstreamHandler.scala:320) [play_2.11-2.3.2.jar:2.3.2]
at scala.Option.map(Option.scala:145) [scala-library-2.11.1.jar:na]
Caused by: akka.pattern.AskTimeoutException: Ask timed out on [ActorSelection[Anchor(akka://play/), Path(/user/EmailServiceActor)]] after [190000 ms]
at akka.pattern.PromiseActorRef$$anonfun$1.apply$mcV$sp(AskSupport.scala:333) ~[akka-actor_2.11-2.3.4.jar:na]
at akka.actor.Scheduler$$anon$7.run(Scheduler.scala:117) ~[akka-actor_2.11-2.3.4.jar:na]
at scala.concurrent.Future$InternalCallbackExecutor$.unbatchedExecute(Future.scala:599) ~[scala-library-2.11.1.jar:na]
at scala.concurrent.BatchingExecutor$class.execute(BatchingExecutor.scala:109) ~[scala-library-2.11.1.jar:na]
at scala.concurrent.Future$InternalCallbackExecutor$.execute(Future.scala:597) ~[scala-library-2.11.1.jar:na]