Примеры AsyncCassandraOperations - PullRequest
       14

Примеры AsyncCassandraOperations

0 голосов
/ 09 октября 2018

Я читаю AsyncCassandraOperations, чтобы выполнить асинхронные вставки для повышения производительности на основе другого сообщения здесь .Но я не могу найти много помощи в документации Google или Spring данных.

Ранее я использовал Cassandra Repository для извлечения всех данных и вставки / обновления, которые, по моему мнению, были очень медленными.В соответствии с рекомендацией я сейчас использую AsyncCassandraOperations для одной только операции вставки, но это не позволит мне.Я сталкиваюсь с , требующим bean-компонента типа 'org.springframework.data.cassandra.core.AsyncCassandraOperations' error.

Каков будет правильный способ использования 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 голосов
/ 09 октября 2018

Не знаю, используется ли весенняя загрузка, если это так, AsyncCassandraOperations (AsyncCassandraTemplate является классом реализации) должен создаваться автоматически.Если ошибка показывает, что вам нужен bean-компонент AsyncCassandraOperations, прямой способ - создать его, как показано ниже.

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

Поскольку вы используете интерфейс репозитория данных Spring, вы также можете использовать интерфейс ReactiveCrudRepository для обновленияили вставьте объекты сущностей в Cassandra, что показано в в этом примере проекта данных весны , в качестве альтернативного способа использования класса AsyncCassandraTemplate.

В случае использования ReactiveCrudRepository иЧто касается того, что вы хотите сделать, ваш код нуждается в следующих изменениях.

  1. измените тип возврата WRRepository.findByCol1AndCol2AndCol3(String, boolean, String) с List<WRpojo> на Flux<WRpojo>, чтобы в полной мере использовать реактивную функциональность.
  2. изменить тип возвращаемого значения persist(List<WRpojo>) с логического на Mono<Void>, в результате чего результат также не будет блокироваться.
  3. изменить 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> должны быть подписаны где-то вниз по течению, если вы хотите заблокировать и ждать всехоперации завершены, вы можете позвонить block() на Mono<Void>, что не рекомендуется.

...