首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么在Apache中通过Spring配置Flexy会导致NoSuchElementException

为什么在Apache中通过Spring配置Flexy会导致NoSuchElementException
EN

Stack Overflow用户
提问于 2018-02-07 10:11:52
回答 1查看 130关注 0票数 2

我有一个基于阿帕奇风暴 (1.1.1)的应用程序,它使用Spring (5.0.3)配置和注入基于Hibernate (5.2.12)的数据库服务,这些服务连接到PostgreSQL数据库。

在Hibernate和数据库之间,我将柔性池 (2.0.0)配置在HikariCP (2.7.6)之上,作为数据源(参见图A)。该应用程序是在一些Ubuntu16.04LTS服务器实例上使用最新的OpenJDK 8版本启动的。

在启动我的flexy-pool拓扑之后,我经历了与Storm相关的可悲的运行时异常。但是,这是而不是确定性的。有时它会起作用,有时会抛出下面的异常。如果我没有在我的应用程序中使用flexy-pool (参见图B),那么一切都按预期的方式工作。

代码语言:javascript
复制
Caused by: 
 org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.vladmihalcea.flexypool.config.Configuration]: Factory method 'build' threw exception; nested exception is java.util.NoSuchElementException at 
org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:185) at 
org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:579) ... 42 more  
Caused by: 
 java.util.NoSuchElementException at 
sun.misc.URLClassPath$1.nextElement(URLClassPath.java:282) at 
sun.misc.URLClassPath$1.nextElement(URLClassPath.java:256) at 
java.net.URLClassLoader$3$1.run(URLClassLoader.java:603) at 
java.net.URLClassLoader$3$1.run(URLClassLoader.java:599) at 
java.security.AccessController.doPrivileged(Native Method) at 
java.net.URLClassLoader$3.next(URLClassLoader.java:598) at 
java.net.URLClassLoader$3.hasMoreElements(URLClassLoader.java:623) at 
sun.misc.CompoundEnumeration.next(CompoundEnumeration.java:45) at 
sun.misc.CompoundEnumeration.nextElement(CompoundEnumeration.java:58) at 
java.util.ServiceLoader$LazyIterator.hasNextService(ServiceLoader.java:357) at 
java.util.ServiceLoader$LazyIterator.hasNext(ServiceLoader.java:393) at 
java.util.ServiceLoader$1.hasNext(ServiceLoader.java:474) at 
com.vladmihalcea.flexypool.metric.MetricsFactoryResolver.resolve(MetricsFactoryResolver.java:27) at 
com.vladmihalcea.flexypool.config.Configuration$Builder.build(Configuration.java:165) 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)

图B中使用的Spring配置是这个配置(基于官方的示例):

代码语言:javascript
复制
<bean id="hikariConfig" class="com.zaxxer.hikari.HikariConfig">
    <property name="poolName" value="springHikariCP"/>
    <property name="connectionTestQuery" value="SELECT 1"/>
    <property name="dataSourceClassName" value="${gmetric.dataSourceClassName}"/>
    <property name="dataSourceProperties">
        <props>
            <prop key="url">${shc.gmetric.url}</prop>
            <prop key="user">${shc.gmetric.username}</prop>
            <prop key="password">${shc.gmetric.pw}</prop>
        </props>
    </property>
</bean>

<bean id="poolingDataSource" class="com.zaxxer.hikari.HikariDataSource" destroy-method="close">
    <constructor-arg ref="hikariConfig"/>
</bean>

<bean id="configurationBuilder" class="com.vladmihalcea.flexypool.config.Configuration$Builder">
    <constructor-arg value="uniqueId"/>
    <constructor-arg ref="poolingDataSource"/>
    <constructor-arg value="#{ T(com.vladmihalcea.flexypool.adaptor.HikariCPPoolAdapter).FACTORY }"/>
</bean>

<bean id="configuration" factory-bean="configurationBuilder" factory-method="build"/>

<bean id="flexyPoolDataSource" class="com.vladmihalcea.flexypool.FlexyPoolDataSource" init-method="start" destroy-method="stop">
    <constructor-arg ref="configuration"/>
    <constructor-arg>
        <array>
            <bean class="com.vladmihalcea.flexypool.strategy.IncrementPoolOnTimeoutConnectionAcquiringStrategy.Factory">
                <constructor-arg value="5"/>
            </bean>
            <bean class="com.vladmihalcea.flexypool.strategy.RetryConnectionAcquiringStrategy.Factory">
                <constructor-arg value="2"/>
            </bean>
        </array>
    </constructor-arg>
</bean>

<bean id="entityManagerFactoryGMetrics"
      class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="dataSource" ref="flexyPoolDataSource"/>
    <property name="persistenceUnitName" value="${gmetric.context.name}"/>
    <property name="jpaVendorAdapter">
        <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
            <!--<property name="generateDdl" value="true" />-->
            <property name="databasePlatform" value="${hibernate.dialect}"/>
            <property name="showSql" value="${hibernate.showSQL}"/>
        </bean>
    </property>
    <property name="jpaProperties">
        <props>
            <prop key="hibernate.connection.driver_class">${gmetric.driverClassName}</prop>
            <prop key="hibernate.dialect">${hibernate.dialect}</prop>
            <prop key="hibernate.show_sql">${hibernate.showSQL}</prop>
            <prop key="hibernate.hbm2ddl.auto">${hibernate.hbm2ddl.auto}</prop>
            <prop key="hibernate.current_session_context_class">thread</prop>
        </props>
    </property>
</bean>

我的问题是:

  1. flexy-pool的基于Spring的(默认)配置正确吗?
  2. 是否有防止与flexy-pool相关的运行时异常的解决方案?
  3. 这个NoSuchElementException的原因是什么?
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-02-07 10:36:38

我发现,在我的阴影下的jar中缺少了Dropwizard度量4 (这是flexy-pool所必需的),因此出现了这个有线运行时异常:

代码语言:javascript
复制
<dependency>
    <groupId>io.dropwizard.metrics</groupId>
    <artifactId>metrics-core</artifactId>
    <version>${metrics.version}</version>
</dependency>

根据作者,这与flexy-pool检测相关Dropwizard Metrics处理程序的方式有关(因为它支持DM3和DM4,这两种处理程序不能互换使用)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48661082

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档