13.10. Sending a Message to an Actor and Waiting for a Reply
Problem
You have one actor that needs to ask another actor for some information, and needs an immediate reply. (The first actor can’t continue without the information from the second actor.)
Solution
Use the ?
or ask
methods to send a message to an Akka actor
and wait for a reply, as demonstrated in the following
example:
import
akka.actor._
import
akka.pattern.ask
import
akka.util.Timeout
import
scala.concurrent.
{
Await
,
ExecutionContext
,
Future
}
import
scala.concurrent.duration._
import
scala.language.postfixOps
case
object
AskNameMessage
class
TestActor
extends
Actor
{
def
receive
=
{
case
AskNameMessage
=>
// respond to the 'ask' request
sender
!
"Fred"
case
_
=>
println
(
"that was unexpected"
)
}
}
object
AskTest
extends
App
{
// create the system and actor
val
system
=
ActorSystem
(
"AskTestSystem"
)
val
myActor
=
system
.
actorOf
(
Props
[
TestActor
],
name
=
"myActor"
)
// (1) this is one way to "ask" another actor for information
implicit
val
timeout
=
Timeout
(
5
seconds
)
val
future
=
myActor
?
AskNameMessage
val
result
=
Await
.
result
(
future
,
timeout
.
duration
).
asInstanceOf
[
String
]
println
(
result
)
// (2) a slightly different way to ask another actor for information
val
future2
:
Future
[
String
]
=
ask
(
myActor
,
AskNameMessage
).
mapTo
[
String
]
val
result2
=
Await
.
result
(
future2
,
1
second
)
println
(
result2
)
system
.
shutdown
}
Discussion
Both the ?
or ask
methods use the Future
and Await.result
approach demonstrated in Recipe 13.9. The recipe ...
Get Scala Cookbook now with the O’Reilly learning platform.
O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.