AsyncCassandraOperations示例

时间:2018-10-08 23:55:51

标签: spring-boot cassandra spring-data

我正在阅读AsyncCassandraOperations,以根据另一篇here执行异步插入以提高性能。但是我无法在Google或Spring数据文档中找到很多帮助。

以前,我使用Cassandra存储库进行所有数据提取和插入/更新,但发现这样做非常慢。根据建议,我现在仅将AsyncCassandraOperations用于插入操作,但不会让我使用。我遇到需要类型为'org.springframework.data.cassandra.core.AsyncCassandraOperations'的bean 错误。

请问使用AsyncCassandraOperations的正确方法是什么?

@Autowired private MyRepository repository_name;
@Autowired private AsyncCassandraOperations acops;
public void persist(List<POJO> l_POJO)
{
        System.out.println("Enter Persist: "+new java.util.Date());

        List<l_POJO> l_POJO_stale = repository_name.findBycol1AndStale("sample",false);

        l_POJO_stale.forEach(s -> s.setStale(true));

        l_POJO_stale.forEach(s -> acops.update(s));

        try 
        {
            acops.insert(l_POJO);
        } 
        catch (Exception e) 
        {
            System.out.println("Error in persisting new data");
        }
}

1 个答案:

答案 0 :(得分:0)

不知道是否使用了Spring Boot,如果这样,则应该自动创建AsyncCassandraOperations(AsyncCassandraTemplate是实现类)。 如果错误显示您需要AsyncCassandraOperations bean,则直接方法如下所示。

@Bean
AsyncCassandraTemplate asyncCassandraTemplate(Session session) {
    return new AsyncCassandraTemplate(session);
}

由于您使用的是Spring数据存储库界面,因此您还可以使用ReactiveCrudRepository接口将实体对象更新或插入到Cassandra中(如this spring data example project所示),作为使用{ {1}}类。

对于使用AsyncCassandraTemplate并考虑要执行的操作,您的代码需要进行以下更改。

  1. ReactiveCrudRepository的返回类型从WRRepository.findByCol1AndCol2AndCol3(String, boolean, String)更改为List<WRpojo>,以充分利用反应性功能。
  2. Flux<WRpojo>的返回类型从布尔值更改为persist(List<WRpojo>),从而使结果也不会阻塞。
  3. 将您的Mono<Void>更改为以下内容。
persist(List<WRpojo>)

在反应式编程中,基本上我们不会阻塞任何代码,这意味着应将返回的 public Mono<Void> persist(List<WRpojo> l_wr) { Flux<WRpojo> l_old_wr = objWRRepository.findByCol1AndCol2AndCol3("1", false, "2").doOnNext(s -> s.setStale(true)); return objWRRepository.saveAll(l_old_wr).thenMany(objWRRepository.saveAll(l_wr)).then(); } 订阅到下游的某个地方,如果您确实想阻止并等待所有操作完成,则可以调用{不推荐使用Mono<Void>上的{1}}。