(Java8 + Oauth2 + MySql + Hazelcast + no clustered http sessions)の組み合わせのprodモードで以下のエラーが発生しています。開発モードは正常に機能しました。
Unable to register MBean [HikariDataSource (HikariPool-0)] with key 'dataSou
rce'; nested exception is javax.management.InstanceAlreadyExistsException: com.z
axxer.hikari:name=dataSource,type=HikariDataSource
ログでは、データソース(hazelcast)作成の最初の部分は[dev]モードを示しています。これが意図的かどうかはわかりません。
問題の解決にご協力ください。
Dec 12, 2014 2:44:11 PM org.Apache.catalina.startup.HostConfig deployWAR
INFO: Deploying web application archive D:\tools\Apache-Tomcat-7.0.55\webapps\re
tailenergy.war
[INFO] com.fg.re.ApplicationWebXml - Running with Spring profile(s) : prod
2014-12-12 14:44:19.125 WARN 1368 --- [ost-startStop-1] o.s.b.l.LoggingApplicat
ionListener : Logging environment value '-Djava.util.logging.config.file="
D:\tools\Apache-Tomcat-7.0.55\conf\logging.properties"' cannot be opened and wil
l be ignored (using default location instead)
log4j:WARN No appenders could be found for logger (org.jboss.logging).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.Apache.org/log4j/1.2/faq.html#noconfig for more in
fo.
[DEBUG] com.fg.re.config.AsyncConfiguration - Creating Async Task Executor
[DEBUG] com.fg.re.config.MetricsConfiguration - Registering JVM gauges
[INFO] com.fg.re.config.MetricsConfiguration - Initializing Metrics JMX reportin
g
[INFO] com.hazelcast.instance.DefaultAddressPicker - null [dev] [3.2.5] Prefer I
Pv4 stack is true.
[INFO] com.hazelcast.instance.DefaultAddressPicker - null [dev] [3.2.5] Picked A
ddress[192.168.1.9]:5701, using socket ServerSocket[addr=/0:0:0:0:0:0:0:0,localp
ort=5701], bind any local is true
[INFO] com.hazelcast.system - [192.168.1.9]:5701 [dev] [3.2.5] Hazelcast 3.2.5 (
20140814) starting at Address[192.168.1.9]:5701
[INFO] com.hazelcast.system - [192.168.1.9]:5701 [dev] [3.2.5] Copyright (C) 200
8-2014 Hazelcast.com
[INFO] com.hazelcast.instance.Node - [192.168.1.9]:5701 [dev] [3.2.5] Creating M
ulticastJoiner
[INFO] com.hazelcast.core.LifecycleService - [192.168.1.9]:5701 [dev] [3.2.5] Ad
dress[192.168.1.9]:5701 is STARTING
[INFO] com.hazelcast.cluster.MulticastJoiner - [192.168.1.9]:5701 [dev] [3.2.5]
Members [1] {
Member [192.168.1.9]:5701 this
}
[INFO] com.hazelcast.core.LifecycleService - [192.168.1.9]:5701 [dev] [3.2.5] Ad
dress[192.168.1.9]:5701 is STARTED
[DEBUG] com.fg.re.config.CacheConfiguration - Starting HazelcastCacheManager
[INFO] com.hazelcast.util.HealthMonitor - [192.168.1.9]:5701 [dev] [3.2.5] memor
y.used=242.6M, memory.free=219.4M, memory.total=462.0M, memory.max=891.0M, memor
y.used/total=52.51%, memory.used/max=27.23%, load.process=-100.00%, load.system=
100.00%, load.systemAverage=-100.00%, thread.count=38, thread.peakCount=38, even
t.q.size=0, executor.q.async.size=0, executor.q.client.size=0, executor.q.operat
ion.size=0, executor.q.query.size=0, executor.q.scheduled.size=0, executor.q.io.
size=0, executor.q.system.size=0, executor.q.operation.size=0, executor.q.priori
tyOperation.size=0, executor.q.response.size=0, operations.remote.size=0, operat
ions.running.size=0, proxy.count=0, clientEndpoint.count=0, connection.active.co
unt=0, connection.count=0
[DEBUG] com.fg.re.config.DatabaseConfiguration - Configuring Datasource
[DEBUG] com.zaxxer.hikari.HikariConfig - HikariCP pool HikariPool-0 configuratio
n:
[DEBUG] com.zaxxer.hikari.HikariConfig - autoCommit......................true
[DEBUG] com.zaxxer.hikari.HikariConfig - catalog.........................
[DEBUG] com.zaxxer.hikari.HikariConfig - connectionCustomizer............com.zax
xer.hikari.HikariConfig$1@5a3cdbda
[DEBUG] com.zaxxer.hikari.HikariConfig - connectionCustomizerClassName...
[DEBUG] com.zaxxer.hikari.HikariConfig - connectionInitSql...............
[DEBUG] com.zaxxer.hikari.HikariConfig - connectionTestQuery.............
[DEBUG] com.zaxxer.hikari.HikariConfig - connectionTimeout...............30000
[DEBUG] com.zaxxer.hikari.HikariConfig - dataSource......................
[DEBUG] com.zaxxer.hikari.HikariConfig - dataSourceClassName.............com.mys
ql.jdbc.jdbc2.optional.MysqlDataSource
[DEBUG] com.zaxxer.hikari.HikariConfig - dataSourceJNDI..................
[DEBUG] com.zaxxer.hikari.HikariConfig - dataSourceProperties............{user=r
oot, url=jdbc:mysql://localhost:3306/retailenergy, password=<masked>, prepStmtCa
cheSqlLimit=2048, cachePrepStmts=true, useServerPrepStmts=true, prepStmtCacheSiz
e=250}
[DEBUG] com.zaxxer.hikari.HikariConfig - driverClassName.................
[DEBUG] com.zaxxer.hikari.HikariConfig - idleTimeout.....................600000
[DEBUG] com.zaxxer.hikari.HikariConfig - initializationFailFast..........true
[DEBUG] com.zaxxer.hikari.HikariConfig - isolateInternalQueries..........false
[DEBUG] com.zaxxer.hikari.HikariConfig - jdbc4ConnectionTest.............false
[DEBUG] com.zaxxer.hikari.HikariConfig - jdbcUrl.........................
[DEBUG] com.zaxxer.hikari.HikariConfig - leakDetectionThreshold..........0
[DEBUG] com.zaxxer.hikari.HikariConfig - maxLifetime.....................1800000
[DEBUG] com.zaxxer.hikari.HikariConfig - maximumPoolSize.................10
[DEBUG] com.zaxxer.hikari.HikariConfig - metricRegistry..................com.cod
ahale.metrics.MetricRegistry@4152b59f
[DEBUG] com.zaxxer.hikari.HikariConfig - minimumIdle.....................10
[DEBUG] com.zaxxer.hikari.HikariConfig - password........................<masked
>
[DEBUG] com.zaxxer.hikari.HikariConfig - poolName........................HikariP
ool-0
[DEBUG] com.zaxxer.hikari.HikariConfig - readOnly........................false
[DEBUG] com.zaxxer.hikari.HikariConfig - registerMbeans..................false
[DEBUG] com.zaxxer.hikari.HikariConfig - threadFactory...................
[DEBUG] com.zaxxer.hikari.HikariConfig - transactionIsolation............
[DEBUG] com.zaxxer.hikari.HikariConfig - username........................
[INFO] com.zaxxer.hikari.HikariDataSource - HikariCP pool HikariPool-0 is starti
ng.
[DEBUG] com.fg.re.config.DatabaseConfiguration - Configuring Liquibase
[INFO] com.fg.re.config.hazelcast.HazelcastCacheRegionFactory - Starting up Haze
lcastCacheRegionFactory
[DEBUG] com.fg.re.config.MailConfiguration - Configuring mail server
[INFO] com.fg.re.config.WebConfigurer - Web application configuration, using pro
files: [prod]
[DEBUG] com.fg.re.config.WebConfigurer - Initializing Metrics registries
[DEBUG] com.fg.re.config.WebConfigurer - Registering Metrics Filter
[DEBUG] com.fg.re.config.WebConfigurer - Registering Metrics Servlet
[DEBUG] com.fg.re.config.WebConfigurer - Registering Caching HTTP Headers Filter
[DEBUG] com.fg.re.config.WebConfigurer - Registering static resources production
Filter
[DEBUG] com.fg.re.config.WebConfigurer - Registering GZip Filter
[INFO] com.fg.re.config.WebConfigurer - Web application fully configured
[INFO] com.fg.re.Application - Running with Spring profile(s) : [prod]
[INFO] com.fg.re.config.ThymeleafConfiguration - loading non-reloadable mail mes
sages resources
[WARN] org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebAppl
icationContext - Exception encountered during context initialization - cancellin
g refresh attempt
org.springframework.beans.factory.BeanCreationException: Error creating bean wit
h name 'mbeanExporter' defined in class path resource [org/springframework/conte
xt/annotation/MBeanExportConfiguration.class]: Invocation of init method failed;
nested exception is org.springframework.jmx.export.UnableToRegisterMBeanExcepti
on: Unable to register MBean [HikariDataSource (HikariPool-0)] with key 'dataSou
rce'; nested exception is javax.management.InstanceAlreadyExistsException: com.z
axxer.hikari:name=dataSource,type=HikariDataSource
at org.springframework.beans.factory.support.AbstractAutowireCapableBean
Factory.initializeBean(AbstractAutowireCapableBeanFactory.Java:1554) ~[spring-be
ans-4.0.8.RELEASE.jar:4.0.8.RELEASE]
at org.springframework.beans.factory.support.AbstractAutowireCapableBean
Factory.doCreateBean(AbstractAutowireCapableBeanFactory.Java:539) ~[spring-beans
-4.0.8.RELEASE.jar:4.0.8.RELEASE]
at org.springframework.beans.factory.support.AbstractAutowireCapableBean
Factory.createBean(AbstractAutowireCapableBeanFactory.Java:475) ~[spring-beans-4
.0.8.RELEASE.jar:4.0.8.RELEASE]
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getOb
ject(AbstractBeanFactory.Java:302) ~[spring-beans-4.0.8.RELEASE.jar:4.0.8.RELEAS
E]
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistr
y.getSingleton(DefaultSingletonBeanRegistry.Java:228) ~[spring-beans-4.0.8.RELEA
SE.jar:4.0.8.RELEASE]
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBe
an(AbstractBeanFactory.Java:298) ~[spring-beans-4.0.8.RELEASE.jar:4.0.8.RELEASE]
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean
(AbstractBeanFactory.Java:193) ~[spring-beans-4.0.8.RELEASE.jar:4.0.8.RELEASE]
at org.springframework.beans.factory.support.DefaultListableBeanFactory.
preInstantiateSingletons(DefaultListableBeanFactory.Java:706) ~[spring-beans-4.0
.8.RELEASE.jar:4.0.8.RELEASE]
at org.springframework.context.support.AbstractApplicationContext.finish
BeanFactoryInitialization(AbstractApplicationContext.Java:762) ~[spring-context-
4.0.8.RELEASE.jar:4.0.8.RELEASE]
at org.springframework.context.support.AbstractApplicationContext.refres
h(AbstractApplicationContext.Java:482) ~[spring-context-4.0.8.RELEASE.jar:4.0.8.
RELEASE]
at org.springframework.boot.context.embedded.EmbeddedWebApplicationConte
xt.refresh(EmbeddedWebApplicationContext.Java:109) [spring-boot-1.1.9.RELEASE.ja
r:1.1.9.RELEASE]
at org.springframework.boot.SpringApplication.refresh(SpringApplication.
Java:691) [spring-boot-1.1.9.RELEASE.jar:1.1.9.RELEASE]
at org.springframework.boot.SpringApplication.run(SpringApplication.Java
:320) [spring-boot-1.1.9.RELEASE.jar:1.1.9.RELEASE]
at org.springframework.boot.builder.SpringApplicationBuilder.run(SpringA
pplicationBuilder.Java:142) [spring-boot-1.1.9.RELEASE.jar:1.1.9.RELEASE]
at org.springframework.boot.context.web.SpringBootServletInitializer.cre
ateRootApplicationContext(SpringBootServletInitializer.Java:89) [spring-boot-1.1
.9.RELEASE.jar:1.1.9.RELEASE]
at org.springframework.boot.context.web.SpringBootServletInitializer.onS
tartup(SpringBootServletInitializer.Java:51) [spring-boot-1.1.9.RELEASE.jar:1.1.
9.RELEASE]
at org.springframework.web.SpringServletContainerInitializer.onStartup(S
pringServletContainerInitializer.Java:175) [spring-web-4.0.8.RELEASE.jar:4.0.8.R
ELEASE]
at org.Apache.catalina.core.StandardContext.startInternal(StandardContex
t.Java:5479) [catalina.jar:7.0.55]
at org.Apache.catalina.util.LifecycleBase.start(LifecycleBase.Java:150)
[catalina.jar:7.0.55]
at org.Apache.catalina.core.ContainerBase.addChildInternal(ContainerBase
.Java:901) [catalina.jar:7.0.55]
at org.Apache.catalina.core.ContainerBase.addChild(ContainerBase.Java:87
7) [catalina.jar:7.0.55]
at org.Apache.catalina.core.StandardHost.addChild(StandardHost.Java:649)
[catalina.jar:7.0.55]
at org.Apache.catalina.startup.HostConfig.deployWAR(HostConfig.Java:1083
) [catalina.jar:7.0.55]
at org.Apache.catalina.startup.HostConfig$DeployWar.run(HostConfig.Java:
1880) [catalina.jar:7.0.55]
at Java.util.concurrent.Executors$RunnableAdapter.call(Executors.Java:51
1) [na:1.8.0_25]
at Java.util.concurrent.FutureTask.run(FutureTask.Java:266) [na:1.8.0_25
]
at Java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.
Java:1142) [na:1.8.0_25]
at Java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor
.Java:617) [na:1.8.0_25]
at Java.lang.Thread.run(Thread.Java:745) [na:1.8.0_25]
Caused by: org.springframework.jmx.export.UnableToRegisterMBeanException: Unable
to register MBean [HikariDataSource (HikariPool-0)] with key 'dataSource'; nest
ed exception is javax.management.InstanceAlreadyExistsException: com.zaxxer.hika
ri:name=dataSource,type=HikariDataSource
at org.springframework.jmx.export.MBeanExporter.registerBeanNameOrInstan
ce(MBeanExporter.Java:608) ~[spring-context-4.0.8.RELEASE.jar:4.0.8.RELEASE]
at org.springframework.jmx.export.MBeanExporter.registerBeans(MBeanExpor
ter.Java:533) ~[spring-context-4.0.8.RELEASE.jar:4.0.8.RELEASE]
at org.springframework.jmx.export.MBeanExporter.afterPropertiesSet(MBean
Exporter.Java:415) ~[spring-context-4.0.8.RELEASE.jar:4.0.8.RELEASE]
at org.springframework.beans.factory.support.AbstractAutowireCapableBean
Factory.invokeInitMethods(AbstractAutowireCapableBeanFactory.Java:1613) ~[spring
-beans-4.0.8.RELEASE.jar:4.0.8.RELEASE]
at org.springframework.beans.factory.support.AbstractAutowireCapableBean
Factory.initializeBean(AbstractAutowireCapableBeanFactory.Java:1550) ~[spring-be
ans-4.0.8.RELEASE.jar:4.0.8.RELEASE]
... 28 common frames omitted
Caused by: javax.management.InstanceAlreadyExistsException: com.zaxxer.hikari:na
me=dataSource,type=HikariDataSource
at com.Sun.jmx.mbeanserver.Repository.addMBean(Repository.Java:437) ~[na
:1.8.0_25]
at com.Sun.jmx.interceptor.DefaultMBeanServerInterceptor.registerWithRep
ository(DefaultMBeanServerInterceptor.Java:1898) ~[na:1.8.0_25]
at com.Sun.jmx.interceptor.DefaultMBeanServerInterceptor.registerDynamic
MBean(DefaultMBeanServerInterceptor.Java:966) ~[na:1.8.0_25]
at com.Sun.jmx.interceptor.DefaultMBeanServerInterceptor.registerObject(
DefaultMBeanServerInterceptor.Java:900) ~[na:1.8.0_25]
at com.Sun.jmx.interceptor.DefaultMBeanServerInterceptor.registerMBean(D
efaultMBeanServerInterceptor.Java:324) ~[na:1.8.0_25]
at com.Sun.jmx.mbeanserver.JmxMBeanServer.registerMBean(JmxMBeanServer.j
ava:522) ~[na:1.8.0_25]
at org.springframework.jmx.support.MBeanRegistrationSupport.doRegister(M
BeanRegistrationSupport.Java:195) ~[spring-context-4.0.8.RELEASE.jar:4.0.8.RELEA
SE]
at org.springframework.jmx.export.MBeanExporter.registerBeanInstance(MBe
anExporter.Java:653) ~[spring-context-4.0.8.RELEASE.jar:4.0.8.RELEASE]
at org.springframework.jmx.export.MBeanExporter.registerBeanNameOrInstan
ce(MBeanExporter.Java:598) ~[spring-context-4.0.8.RELEASE.jar:4.0.8.RELEASE]
... 32 common frames omitted
[INFO] com.fg.re.config.hazelcast.HazelcastCacheRegionFactory - Shutting down Ha
zelcastCacheRegionFactory
[INFO] com.zaxxer.hikari.pool.HikariPool - HikariCP pool HikariPool-0 is shuttin
g down.
[DEBUG] com.zaxxer.hikari.pool.HikariPool - Before shutdown pool stats HikariPoo
l-0 (total=10, inUse=3, avail=7, waiting=0)
[DEBUG] com.zaxxer.hikari.pool.HikariPool - After shutdown pool stats HikariPool
-0 (total=0, inUse=0, avail=0, waiting=0)
[INFO] com.fg.re.config.CacheConfiguration - Remove Cache Manager metrics
[INFO] com.fg.re.config.CacheConfiguration - Closing Cache Manager
[INFO] com.hazelcast.core.LifecycleService - [192.168.1.9]:5701 [dev] [3.2.5] Ad
dress[192.168.1.9]:5701 is SHUTTING_DOWN
[INFO] com.hazelcast.initializer - [192.168.1.9]:5701 [dev] [3.2.5] Destroying n
ode initializer.
[INFO] com.hazelcast.instance.Node - [192.168.1.9]:5701 [dev] [3.2.5] Hazelcast
Shutdown is completed in 31 ms.
[INFO] com.hazelcast.core.LifecycleService - [192.168.1.9]:5701 [dev] [3.2.5] Ad
dress[192.168.1.9]:5701 is SHUTDOWN
[ERROR] org.springframework.boot.SpringApplication - Application startup failed
org.springframework.beans.factory.BeanCreationException: Error creating bean wit
h name 'mbeanExporter' defined in class path resource [org/springframework/conte
xt/annotation/MBeanExportConfiguration.class]: Invocation of init method failed;
nested exception is org.springframework.jmx.export.UnableToRegisterMBeanExcepti
on: Unable to register MBean [HikariDataSource (HikariPool-0)] with key 'dataSou
rce'; nested exception is javax.management.InstanceAlreadyExistsException: com.z
axxer.hikari:name=dataSource,type=HikariDataSource
at org.springframework.beans.factory.support.AbstractAutowireCapableBean
Factory.initializeBean(AbstractAutowireCapableBeanFactory.Java:1554) ~[spring-be
ans-4.0.8.RELEASE.jar:4.0.8.RELEASE]
新鮮な観察。以前、同じTomcatで2つのjhipster webappを実行していました。もう1つを削除すると、エラーがなくなります。理由を知ることはできますか?本番環境では、2つのjhipster webappsが同じTomcatで実行される可能性が高くなります。
2つのjhipsterアプリケーションインスタンスが単一のTomcatサーバー上で実行されているという同様の問題がありました。これも https://github.com/jhipster/generator-jhipster/issues/874#issuecomment-113023849 に投稿しました
https://docs.Oracle.com/javase/tutorial/jmx/mbeans/standard.html から
すべてのJMX MBeanにはオブジェクト名が必要です。オブジェクト名はJMXクラス?ObjectNameのインスタンスであり、JMX仕様で定義されている構文に準拠する必要があります。つまり、オブジェクト名にはドメインとキープロパティのリストが含まれている必要があります。
From http://docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/htmlsingle/#boot-features-jmx
- JMX上の監視と管理Java Management Extensions(JMX)は、アプリケーションを監視および管理するための標準メカニズムを提供します。デフォルトでは、Spring BootはBean ID 'mbeanServer'でMBeanServerを作成し、 Spring JMXアノテーション(@ ManagedResource、@ ManagedAttribute、@ ManagedOperation)で注釈が付けられています。
詳細については、JmxAutoConfigurationクラスを参照してください。
https://github.com/spring-projects/spring-boot/blob/master/spring-boot-autoconfigure/src/main/Java/org/springframework/boot/autoconfigure/でJmxAutoConfigurationのコードを確認するjmx/JmxAutoConfiguration.Java 名前付け戦略で使用されるspring.jmx.default-domainプロパティがあることがわかりました。
アプリのapplication.propertiesの1つでそのプロパティを何らかの値に設定すると、この問題が解決しました
spring.jmx.default-domain: test
ドメイン名はarbitrary意的であるため、2つのアプリ間での名前の衝突を回避する合理的な方法のように思えます。
JMXの経験がなかったため、このソリューションに関するフィードバックをお待ちしています。
Tomcat上の各Springアプリケーションにspring.jmx.default-domain
プロパティの異なる値を設定することにより、この種の問題を解決しました。
spring.jmx.default-domain=somevalue
application.propertiesファイル内。
同じTomcatに2つの光アプリをデプロイするために試した2つのことは、poolName(1)を変更するだけでなく、DataSource(2)構成のBean名も変更します。
@Bean(destroyMethod = "shutdown")
public DataSource dataSource2() {
HikariConfig config = new HikariConfig();
config.setPoolName("AARSHikaripool-1");
Bean名はdatasource2で、他のアプリにはdatasourceがあることに注意してください!!
JHipsterの更新:
データソースBeanはもうないので、application.ymlに次を追加します。
spring:
jmx:
default-domain: [application_name]
構成ファイルに以下の注釈を追加するだけです
@EnableMBeanExport(registration=RegistrationPolicy.IGNORE_EXISTING)
それはあなたのために働くでしょう。
これは、アプリケーションが再デプロイされているように見えますが、デプロイ解除時に、コンテナはHikariDataSource
でclose()
またはshutdown()
メソッドを呼び出しませんでした。 Springには、デプロイ解除用に設定できる「破棄」プロパティ(または類似のプロパティ)が必要です。
また、可能であれば、最新バージョンのHikariCP(2.2.5)を使用していることを確認してください。古いバージョンではMBeanが適切に登録解除されなかったと思います。
編集:同じVMにHikariCPを必要とする2つのWARがあり、MBeanを登録する場合、それぞれに異なるpoolName
を使用するように設定する必要があります。デフォルトのプール名HikariPool-0
を使用しています。
次のアプローチは私のために働いた、プール名jmxドメイン(spring.jmx.default-domain)をランダム化します( JmxAutoConfiguration を参照してください):
@Bean
public DataSource dataSource() throws SQLException {
HikariDataSource dataSource = new HikariDataSource(this);
dataSource.setPoolName("dataSource_" + UUID.randomUUID().toString());
return dataSource;
}
@Bean
@ConditionalOnMissingBean(value = ObjectNamingStrategy.class, search = SearchStrategy.CURRENT)
public ParentAwareNamingStrategy objectNamingStrategy() {
ParentAwareNamingStrategy namingStrategy = new ParentAwareNamingStrategy(new AnnotationJmxAttributeSource());
namingStrategy.setDefaultDomain("domain_" + UUID.randomUUID().toString());
return namingStrategy;
}