web-dev-qa-db-fra.com

Spring boot data cassandra probleme réactif JmxReporter

J'ai mis à jour mon projet vers Spring-boot Version 2.1.0.RELEASE.
Maintenant, j'obtiens l'erreur suivante:

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

L'utilisation de la propriété introduite dans ce problème https://github.com/spring-projects/spring-boot/issues/14778 ne semble pas avoir d'effet pour résoudre mon problème.

Comment désactiver jmx pour cassandra?

Ma configuration actuelle cassandra ressemble à ceci:

@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;
    }
}
10
locohost

La propriété spring.data.cassandra.jmx-enabled Est utilisée lorsque Spring Boot configure automatiquement un bean Cassandra Cluster. En étendant AbstractReactiveCassandraConfiguration, vous désactivez ce configuration automatique en faveur du bean Cluster créé par AbstractClusterConfiguration qui est une super-classe de AbstractReactiveCassandraConfiguration. Par conséquent, la propriété n'a aucun effet.

Vous pouvez résoudre votre problème de deux manières:

  1. Supprimez votre sous-classe AbstractReactiveCassandraConfiguration et utilisez les différentes propriétés spring.data.cassandra.* Pour configurer les choses à la place.
  2. Remplacez cluster on AbstractClusterConfiguration in CassandraConfig, appelez super.cluster() pour obtenir le CassandraClusterFactoryBean puis appelez setJmxReportingEnabled(false) on le bean d'usine avant de le retourner.

Sinon, si vous n'utilisez pas Dropwizard ailleurs dans votre application, vous pourrez peut-être rétrograder vers une version plus ancienne compatible avec les rapports JMX de Cassandra en remplaçant la propriété dropwizard-metrics.version Dans votre pom.xml Ou build.gradle.

18
Andy Wilkinson

au lieu de remplacer cluster comme mentionné par Andy Wilkinson, vous pouvez alternativement remplacer getMetricsEnabled pour toujours retourner false.

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

L'inclusion de l'ancienne version de la bibliothèque résout également le problème:

implementation("io.dropwizard.metrics:metrics-core:3.2.2")

2

J'ai essayé les réponses ici, je ne sais pas comment mais l'erreur persiste. J'ai lu ceci sur docs.datastax.com , où ils ont parlé de déplacer JMX reporting Dans Metrics 4 Vers un module séparé, metrics-jmx. Ce qu'ils ont clairement indiqué que cela pourrait provoquer des problèmes/erreurs.

Pour résoudre ce problème, je devais simplement appeler cette méthode .withoutJMXReporting() comme ci-dessous.

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

Vous pouvez suivre tranquillement ici

1
Young Emil