web-dev-qa-db-ja.com

spring boot data cassandra=事後対応型JmxReporterの問題

プロジェクトを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$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

この問題で導入されたプロパティを使用する https://github.com/spring-projects/spring-boot/issues/14778 は私の問題を解決する効果がないようです。

Cassandraのjmxを無効にするにはどうすればよいですか?

私の現在のcassandra configは次のようになります。

@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

spring.data.cassandra.jmx-enabledプロパティは、Spring BootがCassandra Cluster Beanを自動構成するときに使用されます。AbstractReactiveCassandraConfigurationを拡張することにより、この自動構成をオフに切り替えます。 ClusterのスーパークラスであるAbstractClusterConfigurationによって作成されたAbstractReactiveCassandraConfiguration Bean。その結果、プロパティは無効になります。

問題を解決する方法は2つあります。

  1. AbstractReactiveCassandraConfigurationサブクラスを削除し、代わりにさまざまなspring.data.cassandra.*プロパティを使用して設定します。
  2. clusterAbstractClusterConfigurationCassandraConfigをオーバーライドし、super.cluster()を呼び出してCassandraClusterFactoryBeanを取得し、ファクトリBeanでsetJmxReportingEnabled(false)を呼び出してからそれを返す。

あるいは、アプリケーションの他の場所でDropwizardを使用していない場合、dropwizard-metrics.versionまたはpom.xmlbuild.gradleプロパティをオーバーライドすることで、CassandraのJMXレポートと互換性のある古いバージョンにダウングレードできる場合があります。

18
Andy Wilkinson

andy Wilkinsonが言及したclusterをオーバーライドする代わりに、代わりにgetMetricsEnabledをオーバーライドして、常にfalseを返すようにすることもできます。

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

ライブラリの古いバージョンを含めると、問題も修正されます。

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

2

私はここで答えを試しましたが、方法はわかりませんが、エラーはまだ続きました。私はこれを docs.datastax.com から読みました。そこで彼らは_JMX reporting_の_Metrics 4_を別のモジュール_metrics-jmx_に移動することについて話しました。彼らはそれが問題/エラーを引き起こすかもしれないことを明らかにしました。

これを修正するには、次のようにこのメソッドを呼び出す必要がありました.withoutJMXReporting().

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

静かにフォローできます here

1
Young Emil