Reputation: 157
Is anyone using AsyncCassandraTemplate for batch operations with a list of custom objects?
I need to use the same but it seems passing an iterable is no longer supported.
Upvotes: 0
Views: 288
Reputation: 2974
You can achieve that easily using Datastax Driver. If you use Maven just add it to your pom
file:
<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>
Then create an entity class:
@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;
}
}
Then using the following code you can build a cluster then have some objects initiated then create statements for their save queries and then add them to a batch statement that is to be executed asynchronously
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();
}
if you want to handle the result of the execution or do something upon success or failure you can alternatively do something like this
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
}
}
);
Upvotes: 1