2015-12-18 37 views
0

我在幻影-dsl上玩了一下,並且使用CassandraTable類成功實現了對集羣的讀/寫操作。使用Phantom在Cassandra集羣上連接超時

但是,如果while羣集關閉或配置錯誤,我想快速失敗:停止我的CLI與特定超時並退出程序,實際上之前試圖寫東西。

什麼可能是一個很好的方法來實現這一目標?到目前爲止,我已經試過這樣:

object Config { 
    val keySpace = KeySpace("myreallyfirstks") 
    val contactPoint: KeySpaceBuilder = ContactPoint(host = "localhost", port = ContactPoint.DefaultPorts.live) 
    val keySpaceDefinition: KeySpaceDef = contactPoint.keySpace(keySpace.name) 

    lazy val session: Session = keySpaceDefinition.provider.getSession(keySpace.name) 

    trait StandardConnector extends keySpaceDefinition.Connector 
} 

然後

val test = Try(Config.session.executeAsync("select * from system.schema_columns limit 1;").get(1, TimeUnit.SECONDS)) 

    Try(test) match { 
    case Success(_) => println("Someone is alive") 
    case Failure(ex) => println(s"The cluster is down") 
    } 

然而,這將返回我的成功即使我指着未安裝C *的地址。

使用Session直接跳到Java驅動程序完全幻影,但可能有一些幻影,我不知道,它已經完成了這個目標。

回答

1

你幾乎在那裏,除非你只是想在適當的地方混合keySpaceDefinition.Connector,不能訪問任何內部的東西。這是第一個。

的想法是使用DatabaseImpl,然後通過你的KeySpaceDef作爲構造函數參數是:

class Database(val space: KeySpaceDef) extends DatabaseImpl(space) { 
    object users extends Users with space.Connector 
    .. 
} 

然後你可以從這個創建對象或使用供應商特質注入一個Scala的方式(沒有谷歌Guice或任何),如博客文章演示。

然後在控制器:

trait Controller { 
    def database: Database 

def findUser(email: String): Future[Option[User]] = { 
    // For this you might need to mix in a connector into the Controller 
    // itself, since all query methods needs the implicit session 
    // and keySpace definition. 
    database.users.select.where(_.email eqs email).one() 
} 
} 

接下來,趕上初始化問題在適當的時候你需要的是周圍的會話初始化一個catch塊。

相關問題