2012-12-28 1 views
2

나는 ask 패턴을 사용하여 akka Actor를 사용하여 가장 단순한 비동기 요청을하려고하는데, 무엇을 상관없이 akka.pattern.AskTimeoutException을 계속 수신합니다. ActorAction 평소 Async의 래퍼입니다재생! 비동기 액션 akka AskTimeoutException

object Users extends Controller { 

    def newUser = { 
    val actor = Akka.system.actorOf(Props[UserRegistration]) 
    ActorAction[String](actor, "hello")(Ok(_)) 
    } 
} 

: 내가 가지고있는 것은 이것이다

object ActorAction { 

    def apply[A](actorRef: ActorRef, msg: AnyRef, timeout: Timeout = 5 seconds)(f: A => Result)(implicit m: Manifest[A]): Action[AnyContent] = { 
    Action { 
     AsyncResult { 
     ask(actorRef, msg, timeout).mapTo[A].asPromise.map(f) 
     } 
    } 
    } 

} 

그리고 배우 아무것도 안하지만, 수신 메시지를 기록하고 반환

class UserRegistration extends Actor { 
    val log = Logging(context.system, this) 
    def receive = { 
    case u => log.info("received " + u); u 
    } 
} 

메시지 로깅은 정상적으로 작동합니다. 나는 모든 것을 시도했지만 아무것도 작동하지 않습니다. 어떤 도움도 환영합니다!

재생 : 2.9.1 Akka : 2.0.2

스택 트레이스 : 사전에

[info] play - database [default] connected at jdbc:postgresql://localhost:5432/ss_dev 
[info] play - Application started (Dev) 
[info] play - Starting application default Akka system. 
[INFO] [12/28/2012 22:10:42.51] [application-akka.actor.default-dispatcher-1] [akka://application/user/$a] received hello 
[error] play - Waiting for a promise, but got an error: Timed out 
akka.pattern.AskTimeoutException: Timed out 
at akka.dispatch.DefaultPromise.result(Future.scala:875) [akka-actor.jar:2.0.2] 
at akka.dispatch.Await$.result(Future.scala:74) ~[akka-actor.jar:2.0.2] 
at play.api.libs.concurrent.AkkaPromise.await(Akka.scala:43) ~[play_2.9.1.jar:2.0.4] 
at play.api.libs.concurrent.Promise$class.await(Promise.scala:55) ~[play_2.9.1.jar:2.0.4] 
at play.api.libs.concurrent.AkkaPromise.await(Akka.scala:28) ~[play_2.9.1.jar:2.0.4] 
at play.api.libs.concurrent.Promise$class.value(Promise.scala:53) ~[play_2.9.1.jar:2.0.4] 
Caused by: akka.pattern.AskTimeoutException: Timed out 
at akka.pattern.PromiseActorRef$$anonfun$1.apply$mcV$sp(AskSupport.scala:274) ~[akka-actor.jar:2.0.2] 
at akka.actor.DefaultScheduler$$anon$6$$anon$7.run(Scheduler.scala:183) ~[akka-actor.jar:2.0.2] 
at akka.dispatch.TaskInvocation.run(AbstractDispatcher.scala:94) [akka-actor.jar:2.0.2] 
at akka.jsr166y.ForkJoinTask$AdaptedRunnableAction.exec(ForkJoinTask.java:1381) [akka-actor.jar:2.0.2] 
at akka.jsr166y.ForkJoinTask.doExec(ForkJoinTask.java:259) [akka-actor.jar:2.0.2] 
at akka.jsr166y.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:975) [akka-actor.jar:2.0.2] 

감사합니다!

답변

2
당신은 메시지 sender ! u에 회신하지 않을

는 Akka의 참조 문서를 참조하십시오 : http://doc.akka.io

+0

감사 빅토르을! 그것은 일했다! 나는 receive 메소드의 리턴 값이 "reply"라고 생각했다. 고마워. – Gerry

+0

안녕하세요 제리, 수신 방법은 아무것도 (단위)를 반환하지 않습니다, 이것은 0..N "반환 값"을 가질 수 있기 때문입니다. –

관련 문제