使用 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()
 }
}

接下来,要在适当的时候捕获初始化问题,您所需要的只是围绕会话初始化的捕获块。