spring引导数据cassandra反应式JmxReporter问题

spring引导数据cassandra反应式JmxReporter问题,spring,spring-boot,spring-data-cassandra,Spring,Spring Boot,Spring Data Cassandra,我将我的项目更新为spring boot版本2.1.0。发行版。 现在我得到以下错误: Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.data.cassandra.ReactiveSession]: Factory method 'reactiveSession' threw exception; nested exceptio

我将我的项目更新为spring boot版本2.1.0。发行版。
现在我得到以下错误:

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 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1745)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:576)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:498)
    at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:320)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:318)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199)
    at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept(ConfigurationClassEnhancer.java:339)
    at ch.sbb.kat.fc.config.CassandraConfig$$EnhancerBySpringCGLIB$$a22674d7.session(<generated>)
    at org.springframework.data.cassandra.config.AbstractCassandraConfiguration.getRequiredSession(AbstractCassandraConfiguration.java:66)
    at org.springframework.data.cassandra.config.AbstractReactiveCassandraConfiguration.reactiveSession(AbstractReactiveCassandraConfiguration.java:47)
    at ch.sbb.kat.fc.config.CassandraConfig$$EnhancerBySpringCGLIB$$a22674d7.CGLIB$reactiveSession$7(<generated>)
    at ch.sbb.kat.fc.config.CassandraConfig$$EnhancerBySpringCGLIB$$a22674d7$$FastClassBySpringCGLIB$$7973a63.invoke(<generated>)
    at org.springframework.cglib.proxy.MethodProxy.invokeSuper(MethodProxy.java:244)
    at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept(ConfigurationClassEnhancer.java:363)
    at ch.sbb.kat.fc.config.CassandraConfig$$EnhancerBySpringCGLIB$$a22674d7.reactiveSession(<generated>)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:154)
    ... 123 more
Caused by: java.lang.NoClassDefFoundError: com/codahale/metrics/JmxReporter
    at com.datastax.driver.core.Metrics.<init>(Metrics.java:146)
    at com.datastax.driver.core.Cluster$Manager.init(Cluster.java:1501)
    at com.datastax.driver.core.Cluster.init(Cluster.java:208)
    at com.datastax.driver.core.Cluster.connectAsync(Cluster.java:376)
    at com.datastax.driver.core.Cluster.connect(Cluster.java:332)
    at org.springframework.data.cassandra.config.CassandraCqlSessionFactoryBean.connect(CassandraCqlSessionFactoryBean.java:89)
    at org.springframework.data.cassandra.config.CassandraCqlSessionFactoryBean.afterPropertiesSet(CassandraCqlSessionFactoryBean.java:82)
    at org.springframework.data.cassandra.config.CassandraSessionFactoryBean.afterPropertiesSet(CassandraSessionFactoryBean.java:59)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.lambda$invokeInitMethods$5(AbstractAutowireCapableBeanFactory.java:1795)
    at java.security.AccessController.doPrivileged(Native Method)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1794)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1741)
    ... 143 more
Caused by: java.lang.ClassNotFoundException: com.codahale.metrics.JmxReporter
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:335)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    ... 155 more

当spring Boot自动配置cassandra
集群时,将使用
spring.data.cassandra.jmx enabled
属性。通过扩展
AbstractReactiveCassandraConfiguration
,您将关闭此自动配置,以支持由
AbstractClusterConfiguration
创建的
bean,它是
AbstractReactiveCassandraConfiguration
的一个超类。因此,该属性无效

有两种方法可以解决问题:

  • 删除您的
    AbstractReactiveCassandraConfiguration
    子类,并使用各种
    spring.data.cassandra.*
    属性来进行配置
  • CassandraConfig
    中的
    AbstractClusterConfiguration
    上重写
    cluster
    ,调用
    super.cluster()
    获取
    CassandraClusterFactoryBean
    ,然后在返回它之前调用工厂bean上的
    setJmxReportingEnabled(false)

  • 或者,如果您没有在应用程序的其他位置使用Dropwizard,您可以通过覆盖
    pom.xml
    build.gradle

    中的
    dropwizard metrics.version
    属性来降级到与Cassandra的JMX报告兼容的旧版本,而不是像Andy Wilkinson提到的那样覆盖
    cluster
    ,您也可以替代
    getMetricsEnabled
    ,以便始终返回
    false

    @Override
    protected boolean getMetricsEnabled() { return false; }
    

    我尝试了这里的答案,我不知道如何,但错误仍然存在。 我是从那里读到这篇文章的,他们讨论了将
    Metrics 4
    中的
    JMX报告移动到一个单独的模块
    Metrics JMX
    。他们明确表示,这可能会导致问题/错误

    为了解决这个问题,我只需调用这个方法
    。而不调用jmxreporting()
    ,如下所示

    Cluster cluster = Cluster.builder()
            .withoutJMXReporting()
            .build();
    

    您可以安静地遵循

    ,包括旧版本的库也可以解决问题:

    实现(“io.dropwizard.metrics:metrics核心:3.2.2”)
    @Bean 公共CassandracClusterFactoryBean集群(){ CassandraClusterFactoryBean集群=新的CassandraClusterFactoryBean(); setContactPoints(environment.getProperty(“spring.data.cassandra.contactpoints”); setPort(Integer.parseInt(environment.getProperty(“spring.data.cassandra.port”)); cluster.setJmxReportingEnabled(false); 返回簇; }


    答案似乎是cluster.setJmxReportingEnabled(false)。

    ch.sbb.kat.fc.config.CassandraConfig
    在做什么?从它的名字来看,我猜您是在手动配置Cassandra。因此,Boot的自动配置将已退出,因此属性将无效。@AndyWilkinson CassandraConfig扩展了AbstractReactiveCassandraConfiguration I覆盖键空间、联系人点、entitybasepackage和架构操作。集群bean是由spring创建的。感谢您提供的有用答案。票据中的降级提示:问题在于cassandra驱动程序core 3.6.0依赖于dropwizard 3.2.2版。版本4.0.3包含一个导致类未找到错误的破坏性更改。对于使用TestContainer的用户,请注意
    CassandraContainer
    在执行CQL init脚本时使用JMX报告:感谢您指出这一点。我也在寻找重写该值的方法,但总是寻找名称中带有jmx的内容;)这也比从超类获取集群更方便,不客气。
    cluster
    的默认实现调用
    getMetricsEnabled
    。通过只覆盖
    getMetricsEnabled
    ,我们可以保留
    集群的默认实现(和行为)
    这是一种更干净的禁用度量的方法,我喜欢它。
    Cluster cluster = Cluster.builder()
            .withoutJMXReporting()
            .build();