【发布时间】:2015-09-30 18:39:02
【问题描述】:
我通过 Akka 演员调用 def activateReward 并且执行 OracleClient.rewardActivate(user) 有时非常慢(数据库不在我的职责范围内,属于另一家公司)。
当数据库运行缓慢时,线程池耗尽,无法有效分配更多线程来运行回调future.onComplete,因为回调和futures 在相同的执行上下文中工作。
请告知如何从分配给期货 OracleClient.rewardActivate(user) 的线程异步执行回调中的代码
class RewardActivatorHelper {
private implicit val ec = new ExecutionContext {
val threadPool = Executors.newFixedThreadPool(1000)
def execute(runnable: Runnable) {threadPool.submit(runnable)}
def reportFailure(t: Throwable) {throw t}
}
case class FutureResult(spStart:Long, spFinish:Long)
def activateReward(msg:Msg, time:Long):Unit = {
msg.users.foreach {
user =>
val future:Future[FutureResult] = Future {
val (spStart, spFinish) = OracleClient.rewardActivate(user)
FutureResult(spStart, spFinish)
}
future.onComplete {
case Success(futureResult:FutureResult) =>
futureResult match {
case res:FutureResult => Logger.writeToLog(Logger.LogLevel.DEBUG,s"started:${res.spStart}finished:${res.spFinish}")
case _ => Logger.writeToLog(Logger.LogLevel.DEBUG, "some error")
}
case Failure(e:Throwable) => Logger.writeToLog(Logger.LogLevel.DEBUG, e.getMessage)
}
}
}
}
【问题讨论】:
标签: multithreading scala concurrency callback future