Akka 运行中的异常处理

Akka 运行中的异常处理,akka,Akka,我有一个工人师傅,他有一个监工来监督他的童工。 子工作者抛出一个IOException,该IOException由父工作者查看,然后父工作者调用SupervisorStartegy的resume()方法 到目前为止,exoption被抛出,异常被转移到父级,父级调用resume,但在此之后,我得到一个超时异常 public class EmailServiceActor extends UntypedActor{ ActorRef actorRef ; private static Super

我有一个工人师傅,他有一个监工来监督他的童工。 子工作者抛出一个IOException,该IOException由父工作者查看,然后父工作者调用SupervisorStartegy的resume()方法

到目前为止,exoption被抛出,异常被转移到父级,父级调用resume,但在此之后,我得到一个超时异常

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]