spring启动数据cassandra reactive JmxReporter问题
spring boot data cassandra reactive JmxReporter problem
我将项目更新为 spring-boot 版本 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(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[=11=](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(<generated>)
at ch.sbb.kat.fc.config.CassandraConfig$$EnhancerBySpringCGLIB$$a22674d7$$FastClassBySpringCGLIB$73a63.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(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
使用本期介绍的属性https://github.com/spring-projects/spring-boot/issues/14778好像对解决我的问题没有效果
如何为 cassandra 禁用 jmx?
我当前的 cassandra 配置如下所示:
@Configuration
@EnableReactiveCassandraRepositories({"repository"})
public class CassandraConfig extends AbstractReactiveCassandraConfiguration {
@Value("${cassandra.host}")
private String host;
@Override
protected String getKeyspaceName() {
return "keyspace";
}
@Override
public String[] getEntityBasePackages() {
return new String[]{"model"};
}
@Override
public SchemaAction getSchemaAction() {
return SchemaAction.CREATE_IF_NOT_EXISTS;
}
@Override
public String getContactPoints() {
return host;
}
}
spring.data.cassandra.jmx-enabled
属性 在 Spring Boot 自动配置 Cassandra Cluster
bean 时使用。通过扩展 AbstractReactiveCassandraConfiguration
,您将关闭此自动配置以支持由 AbstractClusterConfiguration
创建的 Cluster
bean,它是 AbstractReactiveCassandraConfiguration
的超级 class .因此,属性 无效。
有两种方法可以解决您的问题:
- 删除您的
AbstractReactiveCassandraConfiguration
子 class 并使用各种 spring.data.cassandra.*
属性来配置。
- 在
CassandraConfig
中覆盖 AbstractClusterConfiguration
上的 cluster
,调用 super.cluster()
获取 CassandraClusterFactoryBean
,然后在工厂 bean 上调用 setJmxReportingEnabled(false)
在退货之前。
或者,如果您没有在您的应用程序的其他地方使用 Dropwizard,您可以降级到与 Cassandra 的 JMX 报告兼容的旧版本,方法是覆盖您的 dropwizard-metrics.version
属性 pom.xml
或 build.gradle
.
而不是像 Andy Wilkinson 提到的那样覆盖 cluster
,您可以选择覆盖 getMetricsEnabled
,这样总是 returns false
.
@Override
protected boolean getMetricsEnabled() { return false; }
我试过这里的答案,但我不知道怎么做,但错误仍然存在。
我从 docs.datastax.com 那里读到这篇文章,他们谈到将 Metrics 4
中的 JMX reporting
移动到一个单独的模块 metrics-jmx
。他们明确表示这可能会导致 issues/errors.
要解决此问题,我只需调用此方法 .withoutJMXReporting()
,如下所示。
Cluster cluster = Cluster.builder()
.withoutJMXReporting()
.build();
可以悄悄关注here
包括旧版本的库也修复了问题:
implementation("io.dropwizard.metrics:metrics-core:3.2.2")
@豆子
public CassandraClusterFactoryBean 集群(){
CassandraClusterFactoryBean 集群 = new CassandraClusterFactoryBean();
cluster.setContactPoints(environment.getProperty("spring.data.cassandra.contact-points"));
cluster.setPort(Integer.parseInt(environment.getProperty("spring.data.cassandra.port")));
cluster.setJmxReportingEnabled(假);
return集群;
}
cluster.setJmxReportingEnabled(false) 似乎是答案。
我将项目更新为 spring-boot 版本 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(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[=11=](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(<generated>)
at ch.sbb.kat.fc.config.CassandraConfig$$EnhancerBySpringCGLIB$$a22674d7$$FastClassBySpringCGLIB$73a63.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(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
使用本期介绍的属性https://github.com/spring-projects/spring-boot/issues/14778好像对解决我的问题没有效果
如何为 cassandra 禁用 jmx?
我当前的 cassandra 配置如下所示:
@Configuration
@EnableReactiveCassandraRepositories({"repository"})
public class CassandraConfig extends AbstractReactiveCassandraConfiguration {
@Value("${cassandra.host}")
private String host;
@Override
protected String getKeyspaceName() {
return "keyspace";
}
@Override
public String[] getEntityBasePackages() {
return new String[]{"model"};
}
@Override
public SchemaAction getSchemaAction() {
return SchemaAction.CREATE_IF_NOT_EXISTS;
}
@Override
public String getContactPoints() {
return host;
}
}
spring.data.cassandra.jmx-enabled
属性 在 Spring Boot 自动配置 Cassandra Cluster
bean 时使用。通过扩展 AbstractReactiveCassandraConfiguration
,您将关闭此自动配置以支持由 AbstractClusterConfiguration
创建的 Cluster
bean,它是 AbstractReactiveCassandraConfiguration
的超级 class .因此,属性 无效。
有两种方法可以解决您的问题:
- 删除您的
AbstractReactiveCassandraConfiguration
子 class 并使用各种spring.data.cassandra.*
属性来配置。 - 在
CassandraConfig
中覆盖AbstractClusterConfiguration
上的cluster
,调用super.cluster()
获取CassandraClusterFactoryBean
,然后在工厂 bean 上调用setJmxReportingEnabled(false)
在退货之前。
或者,如果您没有在您的应用程序的其他地方使用 Dropwizard,您可以降级到与 Cassandra 的 JMX 报告兼容的旧版本,方法是覆盖您的 dropwizard-metrics.version
属性 pom.xml
或 build.gradle
.
而不是像 Andy Wilkinson 提到的那样覆盖 cluster
,您可以选择覆盖 getMetricsEnabled
,这样总是 returns false
.
@Override
protected boolean getMetricsEnabled() { return false; }
我试过这里的答案,但我不知道怎么做,但错误仍然存在。
我从 docs.datastax.com 那里读到这篇文章,他们谈到将 Metrics 4
中的 JMX reporting
移动到一个单独的模块 metrics-jmx
。他们明确表示这可能会导致 issues/errors.
要解决此问题,我只需调用此方法 .withoutJMXReporting()
,如下所示。
Cluster cluster = Cluster.builder()
.withoutJMXReporting()
.build();
可以悄悄关注here
包括旧版本的库也修复了问题:
implementation("io.dropwizard.metrics:metrics-core:3.2.2")
@豆子 public CassandraClusterFactoryBean 集群(){ CassandraClusterFactoryBean 集群 = new CassandraClusterFactoryBean(); cluster.setContactPoints(environment.getProperty("spring.data.cassandra.contact-points")); cluster.setPort(Integer.parseInt(environment.getProperty("spring.data.cassandra.port"))); cluster.setJmxReportingEnabled(假); return集群; }
cluster.setJmxReportingEnabled(false) 似乎是答案。