Не удалось проверить ответ Cassandra execcuteAsync

Вот мой образец оригинального метода

public void insertIntoDb(SampleObject sample){
      ---------------------------------------
      ---------------------------------------
      code to prepare Insert statement
      ---------------------------------------
      ---------------------------------------
      session.executeAsync(insertStatement);
}

Я пишу тестовый метод для вышеуказанного метода

public void insertIntoDbTest(){
      --------------------------------------
      ---------------------------------------
      preparing SampleObject and checking the size of the corresponding table before insert
      ---------------------------------------
      ---------------------------------------
      obj.insertIntoDb(sampleObject)

      ---------------------------------------
      checking the size of the corresponding table after insert
      ---------------------------------------
}

Ожидание: после выполнения вышеуказанного метода тестирования в таблицу в cassandra должна быть добавлена ​​1 дополнительная строка, т.е. если перед вставкой размера таблицы: 0, то после вставки размера таблицы: 1

Фактически: я получаю одинаковый размер, т.е. размер таблицы до и после равен 0.

Если я заменю

session.executeAsync(insertStatement);

с участием

ResultSetFuture future = session.executeAsync(insertStatement);

затем добавьте ниже заявление

future.get()

то я получаю разницу в размере таблицы, т.е. 1

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
143
2

Ответы 2

Я подозреваю, что вычисление (вставка) не завершено, когда вы впервые пытаетесь проверить размер таблицы.

Метод ResultSetFuture get() ожидает, если необходимо, завершения вычисления, а затем получает его результат.

Метод executeAsync не дожидается.

Он возвращается, как только запрос был передан в базовый сетевой стек. В частности, возврат из этого метода не гарантирует, что запрос действителен или даже был отправлен действующему узлу. Любое исключение, связанное с ошибкой запроса, будет выдано при доступе к ResultSetFuture. Источник: https://docs.datastax.com/en/drivers/java/2.1/com/datastax/driver/core/ResultSetFuture.html

Я не могу изменить функциональность исходного метода

Sat 21.09.2018 13:01

Вы можете попробовать добавить Thread.sleep(60000) перед проверкой, чтобы ваш тест подождал 1 минуту, прежде чем данные проверки будут вставлены. Это не самое лучшее решение, и оно все равно может дать сбой в зависимости от настроек и конфигурации Cassandra.

Andrea Nagy 21.09.2018 13:22

Я уже пытался использовать Thread.sleep(), даже если мне потребовалось 2 минуты, и он не работает

Sat 25.09.2018 11:54

future.get () - это код блокировки, поэтому он обеспечивает выполнение асинхронного потока и возвращает ответ. В вашем случае он гарантирует, что он вставит запись, поэтому вы получаете размер 1, когда вы утверждаете после вызова future.get (), и если вы не вызываете get (), тогда он будет асинхронным, у вас может быть для вызова future.complete () в этом случае будет два сценария: один с исключением и один без него, а типом возвращаемого значения этого метода будет Future <> Object, который вы должны обрабатывать где-то над трассировкой вызова метода.

Я не могу изменить функциональность исходного метода

Sat 21.09.2018 13:01

Другие вопросы по теме