0

現在、Phantom DSL を小さな Play アプリケーションに統合する作業を行っています。Docker 環境でアプリを実行することを計画しているので、ローカル マシンで Docker Compose を使用してアプリをテストしています。

ただし、Cassandra インスタンスと Play アプリを同時に起動すると、Cassandra の前に Play アプリが使用可能になるため、接続も機能もできません。

現在、次のようにコネクタをセットアップしています。

object Defaults {
  val connector = ContactPoint(sys.env("CASSANDRA_URL"), sys.env("CASSANDRA_PORT").toInt)
    .withClusterBuilder(_.withSocketOptions(
      new SocketOptions().setTcpNoDelay(true))
    ).keySpace("my_app")
}

データベースがこのように初期化されていると

class CassandraDB(val keyspace: KeySpaceDef) extends Database(keyspace) {
  object users extends ConcreteUsers with keyspace.Connector
  object articles extends ConcreteArticles with keyspace.Connector
  object comments extends ConcreteComments with keyspace.Connector
}


object CassandraDB extends CassandraDB(Defaults.connector)

そして私のプレイ!コントローラーは、CassandraDB オブジェクトを使用してデータベースを呼び出します

def index = Action.async {
  CassandraDB.users.getAll.map { users =>
    Ok(Json.toJson(users))
  }
}

データベースへの最初の接続試行で、予想される NoHostAvailableException が発生する

com.datastax.driver.core.exceptions.NoHostAvailableException: All host(s) tried for query failed (tried: localhost/127.0.0.1:9042)

それ以降のリクエストは、次の例外をスローします。

play.api.UnexpectedException: Unexpected exception[RuntimeException: java.lang.NoClassDefFoundError: Could not initialize class models.CassandraDB$]

それが発生したら、アプリケーションを機能させるには、アプリケーションを手動で再起動する必要があります。

Cassandra コンテナーが完全に初期化されるのを待っている間は正常に動作しますが、これは理想的ではないようで、接続に失敗した後に再試行できるようにしたいと考えていました。

4

1 に答える 1