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