标签: spring-data-cassandra

如何关闭Spring Boot命令行应用程序

我正在使用Spring Boot构建一个Command Line java应用程序,以使其快速运行.

应用程序加载不同类型的文件(例如CSV)并将它们加载到Cassandra数据库中.它不使用任何Web组件,它不是Web应用程序.

我遇到的问题是在工作完成后停止应用程序.我使用Spring CommandLineRunner接口@Component来运行任务,如下所示,但是当工作完成后,应用程序不会停止,它会因某种原因而继续运行,我找不到阻止它的方法.

@Component
public class OneTimeRunner implements CommandLineRunner {

    @Autowired
    private CassandraOperations cassandra;

    @Autowired
    private ConfigurableApplicationContext context;

    @Override
    public void run(String... args) throws Exception {
        // do some work here and then quit
        context.close();
    }
}
Run Code Online (Sandbox Code Playgroud)

更新:问题似乎是spring-cassandra,因为项目中没有其他内容.有谁知道为什么它保持线程在后台运行,阻止应用程序停止?

更新:更新到最新的春季启动版本后问题消失了.

java spring spring-boot spring-data-cassandra

28
推荐指数
5
解决办法
3万
查看次数

使用Spring Data Cassandra动态创建键空间,表和生成表

使用Cassandra,我想使用Spring Boot应用程序动态创建键空间和表.我正在使用基于Java的配置.

我有一个用@Table注释的实体,我希望在应用程序启动之前创建它的模式,因为它具有事先已知的固定字段.

但是,根据登录用户的不同,我还想动态地为这些用户创建附加表,并能够向这些表插入条目.

有人可以引导我使用一些我可以利用的资源,或指出我如何解决这些问题.非常感谢您的帮助!

java cassandra spring-boot spring-data-cassandra

11
推荐指数
2
解决办法
1万
查看次数

带有 cassandra 的 Spring 数据给出 IllegalStateException

我对 cassandra 完全陌生,所以我的错误可能很明显。

我正在尝试使用 spring boot(版本 2.3.0.M2)创建一个应用程序,该应用程序与安装在本地主机中的 cassandra(版本 3.11.6)联系。

我有一个带有消息的 java.lang.IllegalStateException:由于您提供了明确的联系点,因此必须明确设置本地 DC(请参阅配置中的 basic.load-balancing-policy.local-datacenter,或以编程方式设置它SessionBuilder.withLocalDatacenter)。目前的联系点是:Node(endPoint=localhost:9042, hostId=16a785a4-eaf3-4a4d-a216-5244d75206aa, hashCode=7b0b99d7)=datacenter1。此集群中的当前 DC 是:datacenter1

我的pom是以下一个:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.0.M2</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.test</groupId>
    <artifactId>cassandra</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>cassandra</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-cassandra</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>io.projectreactor</groupId>
            <artifactId>reactor-test</artifactId>
            <scope>test</scope>
        </dependency> …
Run Code Online (Sandbox Code Playgroud)

spring-boot spring-data-cassandra

11
推荐指数
4
解决办法
4358
查看次数

带有Spring Data和Cassandra @Query的IN子句

我正在尝试使用IN子句和Spring Data中的@Query注释来查询Cassandra表.我有一个表,其分区键为last_name,聚类键为first_name.

我有这个查询工作

@Query("SELECT * FROM people WHERE last_name=?0")
public List<People> findByLastName(String lastName);
Run Code Online (Sandbox Code Playgroud)

我想做点什么

@Query("SELECT * FROM people WHERE last_name=?0 AND first_name IN ?1")
public List<People> findByLastName(String lastName, String[] firstName);
Run Code Online (Sandbox Code Playgroud)

我有它正在使用

CassandraOperations.select("SELECT * FROM people WHERE last_name=" + lastName + 
" AND first_name IN (" + concatinatedNameList + ")", People.class);
Run Code Online (Sandbox Code Playgroud)

但由于一些原因(代码风格,测试,我发誓还有更多)我宁愿使用@Query.有任何想法吗?

编辑更多信息!

传入数组,设置或列出返回值 Caused by: java.lang.IllegalArgumentException: encountered unsupported query parameter type [class [Ljava.lang.String;] in method public abstract

还尝试过:

String firstName = "Joe,Jim";
@Query("SELECT * FROM people WHERE last_name=?0 AND first_name …
Run Code Online (Sandbox Code Playgroud)

java spring cassandra spring-data spring-data-cassandra

10
推荐指数
1
解决办法
8613
查看次数

spring boot数据cassandra反应式JmxReporter问题

我将我的项目更新为spring-boot Version 2.1.0.RELEASE.
现在我收到以下错误:

Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.data.cassandra.ReactiveSession]: Factory method 'reactiveSession' threw exception; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'session' defined in class path resource [ch/sbb/kat/fc/config/CassandraConfig.class]: Invocation of init method failed; nested exception is java.lang.NoClassDefFoundError: com/codahale/metrics/JmxReporter
    at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:185)
    at org.springframework.beans.factory.support.ConstructorResolver.lambda$instantiate$2(ConstructorResolver.java:615)
    at java.security.AccessController.doPrivileged(Native Method)
    at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:614)
    ... 120 more
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'session' defined in class path resource [ch/sbb/kat/fc/config/CassandraConfig.class]: Invocation of init method failed; nested exception is java.lang.NoClassDefFoundError: com/codahale/metrics/JmxReporter
    at …
Run Code Online (Sandbox Code Playgroud)

spring spring-boot spring-data-cassandra

10
推荐指数
4
解决办法
6015
查看次数

Cassandra + SpringBoot,java.lang.ClassNotFoundException:com.datastax.oss.protocol.internal.SegmentCodec

我正在尝试使用 Cassandra DB 创建一个 Spring 应用程序。但是当我尝试运行该应用程序时出现以下错误。

Caused by: java.lang.NoClassDefFoundError: com/datastax/oss/protocol/internal/SegmentCodec
    ... 103 common frames omitted
Caused by: java.lang.ClassNotFoundException: com.datastax.oss.protocol.internal.SegmentCodec
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381) ~[na:1.8.0_152-release]
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424) ~[na:1.8.0_152-release]
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331) ~[na:1.8.0_152-release]
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357) ~[na:1.8.0_152-release]
    ... 103 common frames omitted
Run Code Online (Sandbox Code Playgroud)

Spring Boot版本:2.3.4.RELEASE

Cassandra(spring-boot-starter-data-cassandra)版本:3.0.4

application.yml 文件:

spring:

  data:
    cassandra:
      keyspaceName: my_keyspace
      contactPoints: localhost
      port: 9042
      schema-action: CREATE_IF_NOT_EXISTS
      local-datacenter: datacenter1
Run Code Online (Sandbox Code Playgroud)

CassandraConfig.java

@Configuration
@EnableCassandraRepositories(basePackages = "com.myproject.repository")
public class CassandraConfig extends AbstractCassandraConfiguration {

    @Value("${spring.data.cassandra.keyspaceName}")
    private String keyspace;

    @Value("${spring.data.cassandra.contactPoints}")
    private String contactPoints;

    @Value("${spring.data.cassandra.port}")
    private int port;

    @Value("${spring.data.cassandra.local-datacenter}")
    private String …
Run Code Online (Sandbox Code Playgroud)

cassandra classnotfoundexception spring-boot spring-data-cassandra cassandra-3.0

9
推荐指数
1
解决办法
2968
查看次数

Spring Cassandra 超时查询“SELECT * FROM system_schema.tables”在 PT2S 后超时

我正在使用 Spring Boot2.4.4和 Spring Data Cassandra 依赖项连接到 Cassandra 数据库。在应用程序启动期间,我收到 DriverTimeout 错误(我正在使用 VPN)。

我已经浏览了所有与此类似的 Stack Overflow 问题,但没有一个对我有用。我在 Spring Boot官方页面上交叉发布了同样的问题。

我使用了下面的配置属性 -

spring.data.cassandra.contact-points=xxxxxx
spring.data.cassandra.username=xxxx
spring.data.cassandra.password=xxxxx
spring.data.cassandra.keyspace-name=xxxx
spring.data.cassandra.port=9042
spring.data.cassandra.schema-action=NONE
spring.data.cassandra.local-datacenter=mydc
spring.data.cassandra.connection.connect-timeout=PT10S
spring.data.cassandra.connection.init-query-timeout=PT20S
spring.data.cassandra.request.timeout=PT10S
Run Code Online (Sandbox Code Playgroud)

我还在 application.properties 中添加了 DataStax 属性,以检查是否可以从那里获取它们。

datastax-java-driver.basic.request.timeout = 10 seconds
datastax-java-driver.advanced.connection.init-query-timeout = 10 seconds
datastax-java-driver.advanced.control-connection.timeout = 10 seconds
Run Code Online (Sandbox Code Playgroud)

以下是我按照帖子中的建议使用的配置-

@EnableCassandraRepositories
public class CassandraConfig {
    @Bean
        DriverConfigLoaderBuilderCustomizer cassandraDriverCustomizer() {
            return (builder) -> builder.withDuration(DefaultDriverOption.CONTROL_CONNECTION_TIMEOUT,
                    Duration.ofSeconds(30));
        }
}
Run Code Online (Sandbox Code Playgroud)

但我仍然遇到同样的错误

Caused by: com.datastax.oss.driver.api.core.DriverTimeoutException: query 'SELECT * FROM system_schema.tables' timed out …
Run Code Online (Sandbox Code Playgroud)

java spring cassandra spring-boot spring-data-cassandra

9
推荐指数
2
解决办法
2万
查看次数

Spark与Cassandra输入/输出

想象一下以下场景:Spark应用程序(Java实现)正在使用Cassandra数据库加载,转换为RDD并处理数据.该应用程序还从数据库中蒸出新数据,这些数据也由自定义接收器处理.流处理的输出存储在数据库中.该实现使用Spring Data Cassandra与数据库集成.

CassandraConfig:

@Configuration
@ComponentScan(basePackages = {"org.foo"})
@PropertySource(value = { "classpath:cassandra.properties" })
public class CassandraConfig {

    @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 { …
Run Code Online (Sandbox Code Playgroud)

java cassandra apache-spark spring-data-cassandra

8
推荐指数
1
解决办法
8323
查看次数

spring-data-cassandra存储库支持多个密钥空间?

Spring Data Cassandra是否支持同一应用程序上下文中的多个键空间存储库?我正在使用以下JavaConfig类设置cassandra spring数据配置

@Configuration
@EnableCassandraRepositories(basePackages = "com.blah.repository")
public class CassandraConfig extends AbstractCassandraConfiguration {

@Override
public String getKeyspaceName() {
    return "keyspace1";
}
Run Code Online (Sandbox Code Playgroud)

在将存储库类移动到另一个包之后,我尝试创建第二个配置类.

@Configuration
@EnableCassandraRepositories(basePackages = "com.blah.secondrepository")
public class SecondCassandraConfig extends AbstractCassandraConfiguration {

@Override
public String getKeyspaceName() {
    return "keyspace2";
}
Run Code Online (Sandbox Code Playgroud)

但是,在这种情况下,第一个集合,如果存储库失败,因为在键空间中找不到实体的已配置列族.我认为它可能正在寻找第二个键空间中的列族.

spring-data-cassandra是否支持多个密钥空间存储库?我找到多个键空间的引用的唯一地方就在这里.但它没有解释是否可以使用存储库完成此操作?

java spring spring-data spring-data-cassandra

8
推荐指数
2
解决办法
5176
查看次数

在 Spring Converter 中将 `null` 转换为某个值

添加新列时,数据库 (Cassandra) 不允许指定默认值。因此null,每一行都有新的列。

现在,我们为实体添加了一个标志(将来可能会获得更多条目):

enum UsageFlag {
    OTHER,
    SPECIAL_VALUE,
}
Run Code Online (Sandbox Code Playgroud)

我们还添加了一个 ReadingConverter:

@ReadingConverter
public class UsageFlagReadingConverter implements Converter<String, UsageFlag> {
  @Nonnull
  @Override
  public UsageFlag convert(String source) {
    return source == null
        ? UsageFlag.OTHER
        : UsageFlag.valueOf(source);
  }
}
Run Code Online (Sandbox Code Playgroud)

它应该基本上把nullUsageFlag.OTHER在分析任何其他非空值作为枚举成员。

但是,这不起作用,因为根据 Spring 文档,只有在值不是时才会调用Converterconvert 方法。因此,如果该实体在数据库中,则该实体的字段仍然存在。如果(且仅当)有值时,它才能正常工作。由于整个列在创建时为空,这完全违背了. nullnullnullReadingConverter

Cassandra 似乎不支持为每一行设置一个值(如UPDATE foo SET flag='OTHER' WHERE True),所以这似乎是一个不错的选择。我们希望避免手动接触数据库中的每一行。

在这种情况下,我们有什么方法可以使用 Spring 来提供帮助吗?或者有没有办法使用 CQL 或 Cassandra 解决这个问题?

编辑:有关设置的更多上下文:

public interface FancyEntityRepository …
Run Code Online (Sandbox Code Playgroud)

java spring cql cassandra spring-data-cassandra

7
推荐指数
1
解决办法
324
查看次数