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