programing

스프링 부트 데이터 카산드라 반응성 JmxReporter 문제

telecom 2023. 6. 29. 19:47
반응형

스프링 부트 데이터 카산드라 반응성 JmxReporter 문제

프로젝트를 Spring-boot Version 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

이번 호에 소개된 속성 https://github.com/spring-projects/spring-boot/issues/14778 을 사용하는 것은 제 문제를 해결하는 데 아무런 효과가 없는 것 같습니다.

어떻게 하면 카산드라에 대한 jmx를 비활성화할 수 있습니까?

현재 카산드라 구성은 다음과 같습니다.

@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콩. 늘림으로.AbstractReactiveCassandraConfiguration다음을 위해 이 자동 구성을 끕니다.Cluster에 의해 만들어지는 콩AbstractClusterConfiguration그것은 최고의 클래스입니다.AbstractReactiveCassandraConfiguration결과적으로 속성은 아무런 영향을 미치지 않습니다.

문제를 해결할 수 있는 두 가지 방법이 있습니다.

  1. 제거합니다.AbstractReactiveCassandraConfiguration하위 클래스 및 다양한 사용spring.data.cassandra.*속성을 사용하여 대신 구성할 수 있습니다.
  2. 재정의clusterAbstractClusterConfigurationCassandraConfig,불러super.cluster()을 얻기 위해CassandraClusterFactoryBean그리고 나서 전화합니다.setJmxReportingEnabled(false)반송하기 전에 공장 콩에.

또는 응용 프로그램의 다른 곳에서 DropWizard를 사용하지 않는 경우, Cassandra의 JMX 보고와 호환되는 이전 버전으로 다운그레이드할 수 있습니다.dropwizard-metrics.version당신의 재산pom.xml또는build.gradle.

우선하는 대신에cluster앤디 윌킨슨이 언급한 것처럼, 당신은 대체적으로 당신을 무시할 수 있습니다.getMetricsEnabled그래서 그것은 항상 돌아옵니다.false.

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

여기서 답을 해봤는데, 어떻게 된 건지 모르겠지만 오류가 계속됐습니다.저는 이것을 그들이 이사에 대해 이야기했던 docs.datastax.com 에서 읽었습니다.JMX reportingMetrics 4별도의 모듈로,metrics-jmx문제/오류를 일으킬 수 있다는 점을 분명히 했습니다.

이 문제를 해결하려면 이 방법을 호출해야 했습니다..withoutJMXReporting()하기와 같이

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

당신은 여기서 조용히 따라올 수 있습니다.

이전 버전의 라이브러리를 포함하면 다음과 같은 문제도 해결됩니다.

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

@Bean public CassandraClusterFactoryBean 클러스터{CassandraClusterFactoryBean 클러스터=새로운 CassandraClusterFactoryBean(); 클러스터.ContactPoints(environment.getProperty("spring.data.cassandra.contact-points"); 클러스터를 설정합니다.setPort(Integer.parseInt(environment.getProperty("spring.data.cassandra.port")); 클러스터.setJmxReportingEnabled(false); 반환 클러스터; }

무리를 짓다setJmxReportingEnabled(거짓)가 정답인 것 같습니다.

언급URL : https://stackoverflow.com/questions/53101753/spring-boot-data-cassandra-reactive-jmxreporter-problem

반응형