В настоящее время я работаю над интеграцией Phantom DSL в небольшое приложение Play. Поскольку мы планируем запустить приложение в среде Docker, я использую Docker Compose на своем локальном компьютере для тестирования приложения.
Однако при одновременной загрузке экземпляра Cassandra и приложения Play он не может подключиться или работать, поскольку приложение Play доступно до Cassandra.
В настоящее время я настроил коннектор следующим образом:
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 работает нормально, это не кажется идеальным, и я надеялся повторить попытку после того, как ему не удалось подключиться.