无法测试cassandra ExecuteAsync响应

bjg7j2ky  于 2021-06-15  发布在  Cassandra
关注(0)|答案(2)|浏览(366)

这是我的原始方法示例

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中的表中添加一个额外的行,即如果插入表大小之前为0,那么插入表大小之后为1
实际:我得到相同的大小,即大小的表之前和之后是0只。
如果我替换 session.executeAsync(insertStatement);ResultSetFuture future = session.executeAsync(insertStatement); 然后添加下面的语句 future.get() 然后我得到了table大小的差异,即1

nfeuvbwi

nfeuvbwi1#

get()是一个阻塞代码,因此它确保异步线程执行并返回响应。在您的情况下,它将确保它将插入一条记录,这就是为什么您在调用future.get()后Assert时得到大小为1的原因,如果您不调用get(),那么它将是异步的,您可能必须调用future.complete()。在这种情况下,将有两种情况,一种是有异常,另一种是没有异常,并且将返回此方法的类型是您必须在方法调用跟踪上方某处处理的未来<>对象。

d4so4syb

d4so4syb2#

我怀疑在您第一次尝试验证表大小时,计算(insert)没有完成。
这个 ResultSetFuture get() 方法在必要时等待计算完成,然后检索其结果。
这个 executeAsync 方法不等待。
一旦查询被传递到底层网络堆栈,它就会返回。特别是,从这个方法返回并不保证查询是有效的,或者甚至已经提交到活动节点。任何与查询失败有关的异常都将在访问resultsetfuture时抛出。资料来源:https://docs.datastax.com/en/drivers/java/2.1/com/datastax/driver/core/resultsetfuture.html

相关问题