2012-10-21 16 views
4

我有這樣的特質訪問的ExecutionContext

trait NonBlockingGoodness extends DataStore { 
    import akka.dispatch.{ Future, ExecutionContext } 
    import akka.util.duration._ 
    import akka.util.Timeout 

    implicit val ec = ExecutionContext.fromExecutorService(yourExecutorServiceGoesHere) 
    implicit lazy val timeout = Timeout(5 seconds)  
} 

我想訪問ExecutionContext在另一個特質像這樣

trait AsyncGoodness extends NonBlockingGoodness { 
    import akka.dispatch.Future 

    def doSomething = { 
    Future { "Future is the bomb." } 
    } 

不過,我得到錯誤

Could not find implicit value for parameter executor: akka.dispatch.ExecutionContext 

已更新: 我想出了h ow得到ExecutionContext範圍內

trait AsyncGoodness extends NonBlockingGoodness { 
    import akka.dispatch.ExecutionContext 
    import akka.dispatch.Future 

    def doSomething()(implicit executor: ExecutionContext) = { 
    Future { "Future is the bomb." } 
    } 

但是,我有一個後續問題。由於我可能在AsyncGoodness中使用ExecutionContext以上的一種以上方法,有沒有辦法將它傳遞到trait級別,而不是像上面我做的那樣在每個方法上傳遞它。

+0

只是一個傳遞的評論:你的名字NonBlockingGoodness意味着所有阻塞是壞的。這是近來常見的觀點,但有點天真:在某些情況下,非阻塞IO可能比阻塞IO更糟。其他問題,例如過度平行並且有(或者沒有)調整好的線程池,甚至避免Amdahl法則的陷阱必須被考慮。以下是一個案例歷史記錄:http://www.bigbeeconsultants.co.uk/blog/dispatch-http-critique –

+1

在他使用它的環境中,非阻塞是否是好的就足夠了?或者你是否認爲這個名字僅僅意味着這個特質會有一些善意,而恰恰是在非阻塞地進行呢?這是什麼,Tumblr? – hoff2

回答

0

事實證明,我需要做的就是明確指定ec返回類型爲編譯器使用它。這裏的工作代碼

trait NonBlockingGoodness extends DataStore { 
    import akka.dispatch.{ Future, ExecutionContext } 
    import akka.util.duration._ 
    import akka.util.Timeout 

    implicit val ec: ExecutionContext = ExecutionContext.fromExecutorService(yourExecutorServiceGoesHere) 
    implicit lazy val timeout = Timeout(5 seconds)  
} 

trait AsyncGoodness extends NonBlockingGoodness { 
    import akka.dispatch.Future 

    def doSomething = { 
    Future { "Future is the bomb." } 
    } 
1

我知道你不必再導入任何東西,但是這樣的東西應該適合你。

trait NonBlockingGoodness { 
    import scala.concurrent.{ Future, ExecutionContext } 
    import scala.concurrent.util.duration._ 
    import akka.util.Timeout 

    object Implicit { 
    implicit val ec = ExecutionContext.Implicits.global 
    implicit lazy val timeout = Timeout(5 seconds) 
    } 

} 

trait AsyncGoodness extends NonBlockingGoodness { 
    import scala.concurrent.Future 
    import Implicit._ 
    def doSomething = { 
    Future { "Future is the bomb." } 
    } 
} 
+0

Bob似乎在Akka2.0上,但你的答案只對Scala2.10有效。 –

+0

我知道我的進口報表不符合他的要求。但我認爲「object Implicit {}」和「import Implicit._」的基本概念在Scala 2.9中有效。 – cessationoftime

+0

羅蘭德是對的,我在阿卡2.0 – Bob