使用Cassandra Spring数据连接到Cassandra Docker容器

时间:2015-12-29 19:16:43

标签: cassandra spring-data

所以我遇到了使用spring data-cassandra连接到单个节点cassandra集群的问题。我正在使用在https://hub.docker.com/_/cassandra/

找到的泊坞窗图片

使用docker-compose并设置以下环境变量:

cassandra_n1:
  image: cassandra:latest
  ports:
    - "9042:9042"
    - "9160:9160"
  hostname: cassandra_n1
  environment:
    CASSANDRA_CLUSTER_NAME: "mycluster"
    CASSANDRA_ENDPOINT_SNITCH: "PropertyFileSnitch"
    CASSANDRA_DC: "DC1"
    CASSANDRA_RACK: "R1"

然后在这个开始之后我尝试使用我的Spring启动应用程序连接到它,这很简单:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

    @SpringBootApplication
    public class MvcApplication {

        public static void main(String[] args) {
            SpringApplication.run(MvcApplication.class);
        }
    }

扫描配置文件:

@Configuration
@PropertySource(value = { "classpath:cassandra.properties" })
@EnableCassandraRepositories(basePackages = { "myproject.repository" })
public class CassandraConfig {

    private static final Logger LOG = LoggerFactory.getLogger(CassandraConfig.class);

    @Autowired
    private Environment env;

    @Bean
    public CassandraClusterFactoryBean cluster() {

        CassandraClusterFactoryBean cluster = new CassandraClusterFactoryBean();
        cluster.setContactPoints(env.getProperty("cassandra.contactpoints"));
        cluster.setPort(Integer.parseInt(env.getProperty("cassandra.port")));

        return cluster;
    }

    @Bean
    public CassandraMappingContext mappingContext() {
        return new BasicCassandraMappingContext();
    }

    @Bean
    public CassandraConverter converter() {
        return new MappingCassandraConverter(mappingContext());
    }

    @Bean
    public CassandraSessionFactoryBean session() throws Exception {

        CassandraSessionFactoryBean session = new CassandraSessionFactoryBean();
        session.setCluster(cluster().getObject());
        session.setKeyspaceName(env.getProperty("cassandra.keyspace"));
        session.setConverter(converter());
        session.setSchemaAction(SchemaAction.NONE);

        return session;
    }

    @Bean
    public CassandraOperations cassandraTemplate() throws Exception {
        return new CassandraTemplate(session().getObject());
    }
}

查看属性文件cassandra.properties,它是:

cassandra.contactpoints=192.168.99.100
cassandra.port=9042
cassandra.keyspace=mykeyspace

我使用docker-machine作为docker守护程序,其地址为192.168.99.100

在我的pom中我正在使用依赖项:

         <dependency>
                <groupId>org.springframework.data</groupId>
                <artifactId>spring-data-cassandra</artifactId>
                <version>1.0.0.RELEASE</version>
                <exclusions>
                    <exclusion>
                        <groupId>org.springframework</groupId>
                        <artifactId>spring-expression</artifactId>
                    </exclusion>
                </exclusions>
            </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-expression</artifactId>
            <version>4.1.7.RELEASE</version>
        </dependency>

构建并运行我的应用程序后,应用程序无法连接到显示消息的cassandra:

 Caused by: com.datastax.driver.core.exceptions.NoHostAvailableException:
 All host(s) tried for query failed (tried: /192.168.99.100:9042 (com.datastax.driver.core.ConnectionException: 
[/192.168.99.100:9042] Unexpected error during transport initialization (com.datastax.driver.core.TransportException: 
[/192.168.99.100:9042] Unexpected exception triggered (java.lang.IndexOutOfBoundsException: 
Not enough readable bytes - Need 4, maximum is 0))))

我尝试将listen_address,broadcast_address和rpc_address设置为docker守护程序ip,但没有成功。 任何帮助都是适当的

0 个答案:

没有答案