0

我正在使用 phantom-dsl 并成功地使用CassandraTable类在集群上实现了读/写操作。

但是,如果 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 驱动程序,但是幻象中可能有一些我不知道的东西,它已经为这个目标完成了。

4

1 回答 1

1

你快到了,除了你只是想keySpaceDefinition.Connector在适当的地方混合,而不是访问任何内部的东西。那是第一个。

这个想法是使用 aDatabaseImpl然后将你的KeySpaceDef作为构造函数参数传递给它:

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

然后您可以从中创建一个对象,或者使用提供者特征以 Scala 方式注入一个(没有 Google 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 块。

于 2015-12-21T10:20:05.207 回答