我正在使用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();
    }
}
更新:问题似乎是spring-cassandra,因为项目中没有其他内容.有谁知道为什么它保持线程在后台运行,阻止应用程序停止?
更新:更新到最新的春季启动版本后问题消失了.
使用Cassandra,我想使用Spring Boot应用程序动态创建键空间和表.我正在使用基于Java的配置.
我有一个用@Table注释的实体,我希望在应用程序启动之前创建它的模式,因为它具有事先已知的固定字段.
但是,根据登录用户的不同,我还想动态地为这些用户创建附加表,并能够向这些表插入条目.
有人可以引导我使用一些我可以利用的资源,或指出我如何解决这些问题.非常感谢您的帮助!
我对 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> …我正在尝试使用IN子句和Spring Data中的@Query注释来查询Cassandra表.我有一个表,其分区键为last_name,聚类键为first_name.
我有这个查询工作
@Query("SELECT * FROM people WHERE last_name=?0")
public List<People> findByLastName(String lastName);
我想做点什么
@Query("SELECT * FROM people WHERE last_name=?0 AND first_name IN ?1")
public List<People> findByLastName(String lastName, String[] firstName);
我有它正在使用
CassandraOperations.select("SELECT * FROM people WHERE last_name=" + lastName + 
" AND first_name IN (" + concatinatedNameList + ")", People.class);
但由于一些原因(代码风格,测试,我发誓还有更多)我宁愿使用@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 …我将我的项目更新为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 …我正在尝试使用 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
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
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 …cassandra classnotfoundexception spring-boot spring-data-cassandra cassandra-3.0
我正在使用 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
我还在 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
以下是我按照帖子中的建议使用的配置-
@EnableCassandraRepositories
public class CassandraConfig {
    @Bean
        DriverConfigLoaderBuilderCustomizer cassandraDriverCustomizer() {
            return (builder) -> builder.withDuration(DefaultDriverOption.CONTROL_CONNECTION_TIMEOUT,
                    Duration.ofSeconds(30));
        }
}
但我仍然遇到同样的错误
Caused by: com.datastax.oss.driver.api.core.DriverTimeoutException: query 'SELECT * FROM system_schema.tables' timed out …想象一下以下场景: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 { …Spring Data Cassandra是否支持同一应用程序上下文中的多个键空间存储库?我正在使用以下JavaConfig类设置cassandra spring数据配置
@Configuration
@EnableCassandraRepositories(basePackages = "com.blah.repository")
public class CassandraConfig extends AbstractCassandraConfiguration {
@Override
public String getKeyspaceName() {
    return "keyspace1";
}
在将存储库类移动到另一个包之后,我尝试创建第二个配置类.
@Configuration
@EnableCassandraRepositories(basePackages = "com.blah.secondrepository")
public class SecondCassandraConfig extends AbstractCassandraConfiguration {
@Override
public String getKeyspaceName() {
    return "keyspace2";
}
但是,在这种情况下,第一个集合,如果存储库失败,因为在键空间中找不到实体的已配置列族.我认为它可能正在寻找第二个键空间中的列族.
spring-data-cassandra是否支持多个密钥空间存储库?我找到多个键空间的引用的唯一地方就在这里.但它没有解释是否可以使用存储库完成此操作?
添加新列时,数据库 (Cassandra) 不允许指定默认值。因此null,每一行都有新的列。
现在,我们为实体添加了一个标志(将来可能会获得更多条目):
enum UsageFlag {
    OTHER,
    SPECIAL_VALUE,
}
我们还添加了一个 ReadingConverter:
@ReadingConverter
public class UsageFlagReadingConverter implements Converter<String, UsageFlag> {
  @Nonnull
  @Override
  public UsageFlag convert(String source) {
    return source == null
        ? UsageFlag.OTHER
        : UsageFlag.valueOf(source);
  }
}
它应该基本上把null如UsageFlag.OTHER在分析任何其他非空值作为枚举成员。
但是,这不起作用,因为根据 Spring 文档,只有在值不是时才会调用Converter的convert 方法。因此,如果该实体在数据库中,则该实体的字段仍然存在。如果(且仅当)有值时,它才能正常工作。由于整个列在创建时为空,这完全违背了. nullnullnullReadingConverter
Cassandra 似乎不支持为每一行设置一个值(如UPDATE foo SET flag='OTHER' WHERE True),所以这似乎是一个不错的选择。我们希望避免手动接触数据库中的每一行。
在这种情况下,我们有什么方法可以使用 Spring 来提供帮助吗?或者有没有办法使用 CQL 或 Cassandra 解决这个问题?
编辑:有关设置的更多上下文:
public interface FancyEntityRepository …