2016-11-14 2 views
0

방금 ​​Play Framework + Akka에서 작업하기 시작했습니다. 하나의 Parent Actor와 하나의 Child Actor가 있습니다 (장래에 초과 할 수 있음). 컨트롤러에서 Api 호출을 만들고 하위 배우의 응답을 기다리고 있습니다.Play Framework에서 부모 - 자식 배우 설정

NotificationController :

@Singleton 
public class NotificationController extends Controller{ 
    final ActorRef commActor; 

    @Inject 
    public NotificationController(ActorSystem system) { 
     commActor = system.actorOf(CommActor.props, "comm-actor"); 
    } 

    public CompletionStage<Result> communicate(int isDirect, int mode, int messageId){ 
     return FutureConverters.toJava(ask(commActor, 
       new CommActorProtocol.CA(isDirect, mode, messageId), 1000)) 
       .thenApply(response -> ok((String) response).as("application/json")); 
    } 
} 

CommActor (부모 배우)

public class CommActor extends UntypedActor { 
    public static Props props = Props.create(CommActor.class); 
    private ActorRef notificationActor; 

    public CommActor(){ 
     notificationActor = this.getContext().actorOf(NotificationActor.props, "notification-actor"); 
    } 

    @Override 
    public void onReceive(Object message) throws Exception { 
     notificationActor.tell(message, self()); 
} 

NotificationActor (아역 배우) :

public class NotificationActor extends UntypedActor{ 
    public static Props props = Props.create(NotificationActor.class); 

    @Override 
    public void onReceive(Object message) throws Exception { 
     sender().tell("Hi from notification", self()); 
    } 
} 

학부모 배우가 올바르게 응답,하지만 난 그것을 교체 할 때 통보. 나는 예외를 얻는다. 나는 그것이 잘못되어 가고있는 곳을 알아낼 수 없다.

play.api.http.HttpErrorHandlerExceptions$$anon$1: Execution exception[[Completio 
nException: akka.pattern.AskTimeoutException: Ask timed out on [Actor[akka://app 
lication/user/comm-actor#1301952259]] after [1000 ms]. Sender[null] sent message 
of type "protocols.CommActorProtocol$CA".]] 
     at play.api.http.HttpErrorHandlerExceptions$.throwableToUsefulException(
HttpErrorHandler.scala:280) 
     at play.api.http.DefaultHttpErrorHandler.onServerError(HttpErrorHandler. 
scala:206) 
     at play.api.GlobalSettings$class.onError(GlobalSettings.scala:160) 
     at play.api.DefaultGlobal$.onError(GlobalSettings.scala:188) 
     at play.api.http.GlobalSettingsHttpErrorHandler.onServerError(HttpErrorH 
andler.scala:98) 
     at play.core.server.netty.PlayRequestHandler$$anonfun$2$$anonfun$apply$1 
.applyOrElse(PlayRequestHandler.scala:100) 
     at play.core.server.netty.PlayRequestHandler$$anonfun$2$$anonfun$apply$1 
.applyOrElse(PlayRequestHandler.scala:99) 
     at scala.concurrent.Future$$anonfun$recoverWith$1.apply(Future.scala:346 
) 
     at scala.concurrent.Future$$anonfun$recoverWith$1.apply(Future.scala:345 
) 
     at scala.concurrent.impl.CallbackRunnable.run(Promise.scala:32) 
Caused by: java.util.concurrent.CompletionException: akka.pattern.AskTimeoutExce 
ption: Ask timed out on [Actor[akka://application/user/comm-actor#1301952259]] a 
fter [1000 ms]. Sender[null] sent message of type "protocols.CommActorProtocol$C 
A". 
     at java.util.concurrent.CompletableFuture.encodeThrowable(Unknown Source 
) 
     at java.util.concurrent.CompletableFuture.completeThrowable(Unknown Sour 
ce) 
     at java.util.concurrent.CompletableFuture.uniApply(Unknown Source) 
     at java.util.concurrent.CompletableFuture$UniApply.tryFire(Unknown Sourc 
e) 
     at java.util.concurrent.CompletableFuture.postComplete(Unknown Source) 
     at java.util.concurrent.CompletableFuture.completeExceptionally(Unknown 
Source) 
     at scala.concurrent.java8.FuturesConvertersImpl$CF.apply(FutureConverter 
sImpl.scala:21) 
     at scala.concurrent.java8.FuturesConvertersImpl$CF.apply(FutureConverter 
sImpl.scala:18) 
     at scala.concurrent.impl.CallbackRunnable.run(Promise.scala:32) 
     at scala.concurrent.BatchingExecutor$Batch$$anonfun$run$1.processBatch$1 
(BatchingExecutor.scala:63) 
Caused by: akka.pattern.AskTimeoutException: Ask timed out on [Actor[akka://appl 
ication/user/comm-actor#1301952259]] after [1000 ms]. Sender[null] sent message 
of type "protocols.CommActorProtocol$CA". 
     at akka.pattern.PromiseActorRef$$anonfun$1.apply$mcV$sp(AskSupport.scala 
:604) 
     at akka.actor.Scheduler$$anon$4.run(Scheduler.scala:126) 
     at scala.concurrent.Future$InternalCallbackExecutor$.unbatchedExecute(Fu 
ture.scala:601) 
     at scala.concurrent.BatchingExecutor$class.execute(BatchingExecutor.scal 
a:109) 
     at scala.concurrent.Future$InternalCallbackExecutor$.execute(Future.scal 
a:599) 
     at akka.actor.LightArrayRevolverScheduler$TaskHolder.executeTask(LightAr 
rayRevolverScheduler.scala:331) 
     at akka.actor.LightArrayRevolverScheduler$$anon$4.executeBucket$1(LightA 
rrayRevolverScheduler.scala:282) 
     at akka.actor.LightArrayRevolverScheduler$$anon$4.nextTick(LightArrayRev 
olverScheduler.scala:286) 
     at akka.actor.LightArrayRevolverScheduler$$anon$4.run(LightArrayRevolver 
Scheduler.scala:238) 
     at java.lang.Thread.run(Unknown Source) 
+0

난 당신이합니다 (메시지를 보낸 사람에 전달할 필요가 있다고 생각 즉, 그 컨트롤러를 아이에게 보내어 올바른 파티에 응답 할 수있게하십시오. 지금은 부모 배우를 보낸 사람으로 전달하므로 자식의 응답이 컨트롤러에 도달하지 않습니다. – rethab

답변

0

이 문제를 해결할 수 있습니다. 어떤 사람이 같은 문제로 붙어있는 경우. 기본적으로 CommActor에서 NotificationActor 로의 무한 루프가 발생했습니다.

CommActor : CA/NA가 통지를 프로토콜입니다

if (message instanceof CA) { 
      int mode = ((CA) message).mode; 
      this.originator = getContext().sender(); 
      switch(mode){ 
      case 1: //SMS 
       break; 
      case 2: //Email 
       break; 
      case 3: //Notification 
       notificationActor.tell(new NA((CA)message), getSelf()); 
       break; 
      } 
     } 
     else if (message instanceof Response) { 
      originator.tell(((Response) message).getResponse(), getSelf()); 
     } 
     else{ 
      unhandled(message); 
     } 

/CommActor

NotificationActor :

@Override 
    public void onReceive(Object message) throws Exception { 
     if (message instanceof NA){ 
getSender().tell(new Response(response), getSelf());}} 
관련 문제