使用 Phantom 的 Cassandra 集群连接超时
Connection timeout on Cassandra cluster using Phantom
我正在玩 phantom-dsl,我使用 CassandraTable
class.
在集群上成功实现了 read/write 操作
但是,如果 while 集群关闭或配置错误,我想快速失败:停止我的 CLI 并退出程序,实际上 before 尝试写点什么。
实现此目标的好方法是什么?到目前为止我已经试过了:
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* 的地址,这 returns 我也成功了。
使用 Session
完全跳过 phantom 直接进入 Java 驱动程序,但是 phantom 中可能有一些我不知道的东西,并且已经为这个目标完成了。
你就快完成了,除了你只是想在适当的时候混合 keySpaceDefinition.Connector
,而不是访问任何内部的东西。这是第一个。
想法是使用 DatabaseImpl
,然后将您的 KeySpaceDef
作为构造函数参数传递给它:
class Database(val space: KeySpaceDef) extends DatabaseImpl(space) {
object users extends Users with space.Connector
..
}
然后您可以从中创建一个对象或使用提供者特征以 Scala 方式注入一个对象(没有 Google Guice 或其他),如博客 post 所示。
然后在控制器中:
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()
}
}
接下来,要在适当的时候捕获初始化问题,您所需要的只是围绕会话初始化的捕获块。
我正在玩 phantom-dsl,我使用 CassandraTable
class.
但是,如果 while 集群关闭或配置错误,我想快速失败:停止我的 CLI 并退出程序,实际上 before 尝试写点什么。
实现此目标的好方法是什么?到目前为止我已经试过了:
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* 的地址,这 returns 我也成功了。
使用 Session
完全跳过 phantom 直接进入 Java 驱动程序,但是 phantom 中可能有一些我不知道的东西,并且已经为这个目标完成了。
你就快完成了,除了你只是想在适当的时候混合 keySpaceDefinition.Connector
,而不是访问任何内部的东西。这是第一个。
想法是使用 DatabaseImpl
,然后将您的 KeySpaceDef
作为构造函数参数传递给它:
class Database(val space: KeySpaceDef) extends DatabaseImpl(space) {
object users extends Users with space.Connector
..
}
然后您可以从中创建一个对象或使用提供者特征以 Scala 方式注入一个对象(没有 Google Guice 或其他),如博客 post 所示。
然后在控制器中:
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()
}
}
接下来,要在适当的时候捕获初始化问题,您所需要的只是围绕会话初始化的捕获块。