首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Cassandra上使用ShedLock的Spring引导应用程序,获得"NullPointerException: table不能为空“

在Cassandra上使用ShedLock的Spring引导应用程序,获得"NullPointerException: table不能为空“
EN

Stack Overflow用户
提问于 2022-11-18 13:07:38
回答 1查看 21关注 0票数 0

我正在尝试使用cassandra将shedlock集成到我的spring引导项目中。

但是在应用程序启动时,我得到了下面的错误。

代码语言:javascript
复制
2022-11-18 17:35:29,162 [main] ERRR o.s.boot.SpringApplication - Application run failed
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'lockProvider'

Caused by: java.lang.NullPointerException: table can not be null
    at java.base/java.util.Objects.requireNonNull(Objects.java:233)
    at net.javacrumbs.shedlock.provider.cassandra.CassandraLockProvider$Configuration.<init>(CassandraLockProvider.java:69)
    at net.javacrumbs.shedlock.provider.cassandra.CassandraLockProvider$Configuration$Builder.build(CassandraLockProvider.java:157)

application.yml文件

代码语言:javascript
复制
server:
  port: 8080
  data:
    cassandra:
      port: ${CASSANDRA_PORT:9042}
      username: ${CASSANDRA_USERNAME:cassandra}
      password: ${CASSANDRA_PASSWORD:cassandra}
      keyspace-name: ${CASSANDRA_KEYSPACE_NAME:my_keyspace}
      schema-action: recreate
      local-datacenter: ${CASSANDRA_LOCAL_DATACENTER:datacenter123}
      contact-points: ${CASSANDRA_HOST:localhost}

配置类

代码语言:javascript
复制
import com.datastax.oss.driver.api.core.CqlSession;
import net.javacrumbs.shedlock.provider.cassandra.CassandraLockProvider;
import net.javacrumbs.shedlock.provider.cassandra.CassandraLockProvider.Configuration;
import net.javacrumbs.shedlock.spring.annotation.EnableSchedulerLock;
import org.springframework.context.annotation.Bean;
import org.springframework.scheduling.annotation.EnableScheduling;

@org.springframework.context.annotation.Configuration

@EnableScheduling
@EnableSchedulerLock(defaultLockAtMostFor = "10m")

public class MyAppSchedulerConfiguration {

  @Bean
  public CassandraLockProvider lockProvider(CqlSession cqlSession) {
    return new CassandraLockProvider(Configuration.builder().withCqlSession(cqlSession).build());
  }
  
}

pom.xml文件

代码语言:javascript
复制
<parent>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-parent</artifactId>
  <version>2.3.7.RELEASE</version>
  <relativePath/> <!-- lookup parent from repository -->
</parent>


<shedlock.version>4.42.0</shedlock.version>

<dependency>
  <groupId>net.javacrumbs.shedlock</groupId>
  <artifactId>shedlock-spring</artifactId>
  <version>${shedlock.version}</version>
</dependency>

<dependency>
  <groupId>net.javacrumbs.shedlock</groupId>
  <artifactId>shedlock-provider-cassandra</artifactId>
  <version>${shedlock.version}</version>
</dependency>

执行Cassandra脚本

代码语言:javascript
复制
CREATE KEYSPACE shedlock with replication={'class':'SimpleStrategy', 'replication_factor':1} and durable_writes=true;
CREATE TABLE shedlock.lock (name text PRIMARY KEY, lockUntil timestamp, lockedAt timestamp, lockedBy text);

我已经通过cqlsh验证锁表是在cassandra中创建的。

到目前为止,我认为问题在于,由于某些原因,CqlSession bean是不可用的,而且应该是这样的。

我已经尝试了正式文件页中提到的配置。

我试过贬低springboot和shedlock的版本,但没有用。**Springboot **版本更改2.5.x (相同错误)2.2.13.version(相同错误) 2.3.x (相同错误)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-11-18 13:56:13

我认为您必须这样指定tableName

代码语言:javascript
复制
  @Bean
  public CassandraLockProvider lockProvider(CqlSession cqlSession) {
    return new CassandraLockProvider(Configuration.builder().withCqlSession(cqlSession).withTableName("lock").build());
  }

在使用配置生成器时,似乎没有设置默认的表名。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74490155

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档