Вот мой образец оригинального метода
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




Я подозреваю, что вычисление (вставка) не завершено, когда вы впервые пытаетесь проверить размер таблицы.
Метод ResultSetFuture get() ожидает, если необходимо, завершения вычисления, а затем получает его результат.
Метод executeAsync не дожидается.
Он возвращается, как только запрос был передан в базовый сетевой стек. В частности, возврат из этого метода не гарантирует, что запрос действителен или даже был отправлен действующему узлу. Любое исключение, связанное с ошибкой запроса, будет выдано при доступе к ResultSetFuture. Источник: https://docs.datastax.com/en/drivers/java/2.1/com/datastax/driver/core/ResultSetFuture.html
Вы можете попробовать добавить Thread.sleep(60000) перед проверкой, чтобы ваш тест подождал 1 минуту, прежде чем данные проверки будут вставлены. Это не самое лучшее решение, и оно все равно может дать сбой в зависимости от настроек и конфигурации Cassandra.
Я уже пытался использовать Thread.sleep(), даже если мне потребовалось 2 минуты, и он не работает
future.get () - это код блокировки, поэтому он обеспечивает выполнение асинхронного потока и возвращает ответ. В вашем случае он гарантирует, что он вставит запись, поэтому вы получаете размер 1, когда вы утверждаете после вызова future.get (), и если вы не вызываете get (), тогда он будет асинхронным, у вас может быть для вызова future.complete () в этом случае будет два сценария: один с исключением и один без него, а типом возвращаемого значения этого метода будет Future <> Object, который вы должны обрабатывать где-то над трассировкой вызова метода.
Я не могу изменить функциональность исходного метода
Я не могу изменить функциональность исходного метода