Skip to content

Instantly share code, notes, and snippets.

@jamie-allen
Created February 19, 2013 01:30
Show Gist options
  • Save jamie-allen/4982333 to your computer and use it in GitHub Desktop.
Save jamie-allen/4982333 to your computer and use it in GitHub Desktop.
class AccountBalanceRetrieverFinal(savingsAccounts: ActorRef, checkingAccounts: ActorRef, moneyMarketAccounts: ActorRef) extends Actor {
def receive = {
case GetCustomerAccountBalances(id) => {
val originalSender = sender
implicit val ec: ExecutionContext = context.dispatcher
context.actorOf(Props(new Actor() {
val promisedResult = Promise[AccountBalances]()
var checkingBalances, savingsBalances, mmBalances: Option[List[(Long, BigDecimal)]] = None
def receive = {
case CheckingAccountBalances(balances) =>
checkingBalances = balances
collectBalances
case SavingsAccountBalances(balances) =>
savingsBalances = balances
collectBalances
case MoneyMarketAccountBalances(balances) =>
mmBalances = balances
collectBalances
}
def collectBalances = (checkingBalances, savingsBalances, mmBalances) match {
case (Some(c), Some(s), Some(m)) =>
if (promisedResult.trySuccess(AccountBalances(checkingBalances, savingsBalances, mmBalances))) {
originalSender ! promisedResult.future
context.system.stop(self)
}
case _ =>
}
savingsAccounts ! GetCustomerAccountBalances(id)
checkingAccounts ! GetCustomerAccountBalances(id)
moneyMarketAccounts ! GetCustomerAccountBalances(id)
context.system.scheduler.scheduleOnce(250 milliseconds) {
if (promisedResult.tryFailure(new TimeoutException)) {
originalSender ! promisedResult.future
context.system.stop(self)
}
}
}))
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment