Обычно другой актер может ответить вам, ничего не зная о вас. Это происходит каждый раз, когда у вас есть сервисный актер, к которому могут обращаться другие актеры.
Допустим, вы поместили логику поиска User
в центральный субъект, к которому можно обратиться, отправив сообщение, содержащее replyTo
ActorRef
, такое что:
object UserBehavior {
sealed trait UserCommand
final case class GetUser(userId: Long, replyTo: ActorRef[UserResponse]
extends UserCommand
final case class UserResponse(user: User)
}
Поскольку у нас нет типов объединения в scala (пока) , у всех ваших актеров нет возможности включить UserResponse
в свое поведение без явного расширения UserResponse
при каждом возможном приемном поведении. .
Вы создаете свое поведение с помощью сообщения, которое получает User
, например:
object MyBehavior {
sealed trait Command
final case class MyUserResponse(user: User) extends Command
}
Но как создать ActorRef
, который получает UserResponse
, но прибывает к вашей двери в виде MyUserResponse
?
Вы создаете адаптированный ответ и используете его при создании запроса GetUser
:
userActor ! UserBehavior.GetUser(
1234,
context.messageAdapter(x => MyUserResponse(x.user)
А теперь вы можете получить MyUserResponse
, так как это часть вашего поведения.