Не думаю, что с тобой что-то не так.
Единственное, что я хочу упомянуть, это то, что я лично предпочитаю не использовать ask
при общении между актерами (и имейте в виду, что это в основном личное предпочтение), поэтому я бы сделал что-то вроде этого:
class UserActivityActor(repository: UserActivityRepository) extends Actor {
import akka.pattern.pipe
import UserActivityActor._
implicit val ec: ExecutionContext = context.dispatcher
def receive = {
case Get(userId) =>
// user's historical activities are retrieved
// via the separate repository
repository.queryHistoricalActivities(userId)
.map(a => UserActivityReceived(userId, a)) // wrap the completed future value in a message
.recover{case ex => RepoFailure(ex.getMessage)} // wrap failure in a local message type
.pipeTo(sender())
class UserProxyActor(userActivities: ActorRef) extends Actor {
import UserProxyActor._
def receive = {
case GetUserActivities(user, sender()) =>
userActivities.forward(UserActivityActor.Get(user))
}
}
Это, однако, устраняет поведение тайм-аута (в исходной реализации запрашивающий субъект будет ожидать не более 5 секунд или получит сбой, в моем случае он может ждать бесконечно).