我正在使用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,因为项目中没有其他内容.有谁知道为什么它保持线程在后台运行,阻止应用程序停止?
更新:更新到最新的春季启动版本后问题消失了.
使用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> …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用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) 我将我的项目更新为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) 我正在尝试使用 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
我正在使用 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) 想象一下以下场景: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) 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是否支持多个密钥空间存储库?我找到多个键空间的引用的唯一地方就在这里.但它没有解释是否可以使用存储库完成此操作?
添加新列时,数据库 (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)
它应该基本上把null如UsageFlag.OTHER在分析任何其他非空值作为枚举成员。
但是,这不起作用,因为根据 Spring 文档,只有在值不是时才会调用Converter的convert 方法。因此,如果该实体在数据库中,则该实体的字段仍然存在。如果(且仅当)有值时,它才能正常工作。由于整个列在创建时为空,这完全违背了. nullnullnullReadingConverter
Cassandra 似乎不支持为每一行设置一个值(如UPDATE foo SET flag='OTHER' WHERE True),所以这似乎是一个不错的选择。我们希望避免手动接触数据库中的每一行。
在这种情况下,我们有什么方法可以使用 Spring 来提供帮助吗?或者有没有办法使用 CQL 或 Cassandra 解决这个问题?
编辑:有关设置的更多上下文:
public interface FancyEntityRepository …Run Code Online (Sandbox Code Playgroud)