2017-10-04 43 views
0

在我的播放應用程序,我爲此在Module.configure()可以在應用程序啓動時阻止一個線程嗎?

bind(classOf[GadgetsReader]).toInstance(GadgetsCsvReader) 
    bind(classOf[Gadgets]).asEagerSingleton() 

然後,我這樣做:

@Singleton 
class Gadgets @Inject()(reader: GadgetsReader) { 
    val all:Seq[Gadget] = reader.readGadgets() 
} 

即同步加載一個大集合的小玩意從CSVfile到內存在啓動時,在一個Play的渲染線程。

我沒有看到Play實例中任何地方實現的類似場景。我想知道我在做什麼是慣用的斯卡拉&玩。

是否可以像這樣同步加載一個非常大的文件,因爲我不想在數據完全加載之前提供任何請求服務?

這是一件好事,我創建了Gadgets類,然後注入它,而不是靜態/對象方法Gadget.all

應該GadgetGadgets上課生活在model

任何其他意見,也將不勝感激。

回答

3

我想這取決於你想要啓動的速度有多快,等等。一般來說,我會說是的,即使Akka的羣集分片已經(或者至少,最後一次我讀了)阻塞呼叫在返回之前等待初始化完成。在你的情況下,它可能是好的,但一個像這樣的阻塞調用通常意味着做IO,並且IO可能失敗(例如,如果你正在從網絡文件系統讀取,並且在啓動時網絡失敗?)。所以有時候,最好設計一下你的應用程序,以便它能夠在沒有完成操作的情況下進行響應(可能還有一個不可用的狀態),並且在異常情況下執行該操作,並重試等等,以防失敗。但也許這對你的情況是過度的。爲了回答你的其他問題 - 是的,依賴注入Gadgets肯定比使用靜態單例更好,這意味着你可以控制Gadgets的創建方式(也許你可能想在測試中以不同的方式初始化它)。

model包中很可能很好,但這很大程度上取決於您的域以及它的外觀。

+0

我已經在注射GadgetReader;是否需要注入Gadgets和GadgetReader? –

相關問題