Cassandra Java API, Datastax - PullRequest
       42

Cassandra Java API, Datastax

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

Кто-нибудь использует AsyncCassandraTemplate для пакетных операций со списком пользовательских объектов?

Мне нужно использовать то же самое, но кажется, что передача итерации больше не поддерживается.

1 Ответ

0 голосов
/ 04 ноября 2018

Этого легко добиться, используя Драйвер Datastax . Если вы используете Maven, просто добавьте его в файл pom:

<dependency>
    <groupId>com.datastax.cassandra</groupId>
    <artifactId>cassandra-driver-core</artifactId>
    <version>3.3.2</version>
</dependency>

<dependency>
    <groupId>com.datastax.cassandra</groupId>
    <artifactId>cassandra-driver-mapping</artifactId>
    <version>3.3.2</version>
</dependency>

<dependency>
    <groupId>com.datastax.cassandra</groupId>
    <artifactId>cassandra-driver-extras</artifactId>
    <version>3.3.2</version>
</dependency>

Затем создайте класс сущности:

@Table(
    name = "message",
    keyspace = "test")

public class Message {
    @PartitionKey
    @Column(name = "message_id")
    private String messageId;

    @ClusteringColumn
    private String date;

    private String title;

    public String getMessageId() {
        return messageId;
    }

    public void setMessageId(String messageId) {
        this.messageId = messageId;
    }

    public String getDate() {
        return date;
    }

    public void setDate(String date) {
        this.date = date;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }
}

Затем, используя следующий код, вы можете построить кластер, затем инициировать некоторые объекты, затем создать операторы для их запросов на сохранение и затем добавить их в пакетный оператор, который должен выполняться асинхронно

public void executeBatchStatement() {
    Cluster cluster = makeCluster();
    Session session = cluster.connect();

    MappingManager mappingManager = new MappingManager(session);
    Mapper<Message> messageMapper = mappingManager.mapper(Message.class);

    Message messageObj1 = new Message();
    Message messageObj2 = new Message();
    Message messageObj3 = new Message();
    // populate these objects

    Statement messageStatement1 = messageMapper.saveQuery(messageObj1, Mapper.Option.saveNullFields(false)); // now this Statement represents the query to save this object
    Statement messageStatement2 = messageMapper.saveQuery(messageObj2, Mapper.Option.saveNullFields(false));
    Statement messageStatement3 = messageMapper.saveQuery(messageObj3, Mapper.Option.saveNullFields(false));

    BatchStatement messageBatchStatement = new BatchStatement();
    messageBatchStatement.add(messageStatement1);
    messageBatchStatement.add(messageStatement2);
    messageBatchStatement.add(messageStatement3);

    session.executeAsync(messageBatchStatement); // execute asynchronously
}

private Cluster makeCluster() {
    return Cluster.builder()
            .addContactPoint("localhost")
            .withPort(9042)
            .build();
} 

если вы хотите обработать результат выполнения или сделать что-то в случае успеха или неудачи, вы можете сделать что-то подобное

ResultSetFuture future = session.executeAsync(messageBatchStatement);
Futures.addCallback(future,
    new FutureCallback<ResultSet>() {
        @Override public void onSuccess(ResultSet result) {
            // handle success
        }

        @Override public void onFailure(Throwable t) {
            // handle error
        }
    }
);
...