Using Spring Batch to write to a Cassandra Database

孤街浪徒 提交于 2020-01-11 03:39:37

问题


As of now, I'm able to connect to Cassandra via the following code:

import com.datastax.driver.core.Cluster;
import com.datastax.driver.core.Session;

public static Session connection() {
    Cluster cluster = Cluster.builder()
        .addContactPoints("IP1", "IP2")
        .withCredentials("user", "password")
        .withSSL()
        .build();
    Session session = null;
    try {
        session = cluster.connect("database_name");
        session.execute("CQL Statement");
    } finally {
        IOUtils.closeQuietly(session);
        IOUtils.closeQuietly(cluster);
    }
    return session;
}

The problem is that I need to write to Cassandra in a Spring Batch project. Most of the starter kits seem to use a JdbcBatchItemWriter to write to a mySQL database from a chunk. Is this possible? It seems that a JdbcBatchItemWriter cannot connect to a Cassandra database.

The current itemwriter code is below:

@Bean
public JdbcBatchItemWriter<Person> writer() {
    JdbcBatchItemWriter<Person> writer = new JdbcBatchItemWriter<Person>();
    writer.setItemSqlParameterSourceProvider(new 
        BeanPropertyItemSqlParameterSourceProvider<Person>());
    writer.setSql("INSERT INTO people (first_name, last_name) VALUES 
        (:firstName, :lastName)");
    writer.setDataSource(dataSource);
    return writer;
}

回答1:


Spring Data Cassandra provides repository abstractions for Cassandra that you should be able to use in conjunction with the RepositoryItemWriter to write to Cassandra from Spring Batch.




回答2:


It is possible to extend Spring Batch to support Cassandra by customising ItemReader and ItemWriter.

ItemWriter example:

public class CassandraBatchItemWriter<Company> implements ItemWriter<Company>, InitializingBean {

    protected static final Log logger = LogFactory.getLog(CassandraBatchItemWriter.class);
    private final Class<Company> aClass;
    @Autowired
    private CassandraTemplate cassandraTemplate;

    @Override
    public void afterPropertiesSet() throws Exception { }

    public CassandraBatchItemWriter(final Class<Company> aClass) {
        this.aClass = aClass;
    }

    @Override
    public void write(final List<? extends Company> items) throws Exception {
        logger.debug("Write operations is performing, the size is {}" + items.size());
        if (!items.isEmpty()) {
            logger.info("Deleting in a batch performing...");
            cassandraTemplate.deleteAll(aClass);
            logger.info("Inserting in a batch performing...");
            cassandraTemplate.insert(items);
        }

        logger.debug("Items is null...");
    }
}

Then you can inject it as a @Bean through @Configuration

@Bean
public ItemWriter<Company> writer(final DataSource dataSource) {
    final CassandraBatchItemWriter<Company> writer = new CassandraBatchItemWriter<Company>(Company.class);
    return writer;
}

Full source code can be found in Github repo: Spring-Batch-with-Cassandra



来源:https://stackoverflow.com/questions/46207022/using-spring-batch-to-write-to-a-cassandra-database

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!