Tomcat 8のコンテキスト構成について質問があります。Tomcat7から8にプロジェクトを移行していて、異常な問題があります。構成に何も変更しないと、エラーが発生しました。
"2015-02-03 12:05:48,310 FIRST_ADMIN ERROR web.context.ContextLoader:331
-> Context initialization failed org.springframework.jmx.export.UnableToRegisterMBeanException:
Unable to register MBean [org.Apache.Tomcat.dbcp.dbcp2.BasicDataSource@434990dd]
with key 'dataSource'; nested exception is
javax.management.InstanceAlreadyExistsException:
Catalina:type=DataSource,Host=localhost,context=/first-
admin,class=javax.sql.DataSource,name="jdbc/datasource/first"
コンテキストの一部:
<Resource name="jdbc/datasource/first"
auth="Container"
type="javax.sql.DataSource"
poolPreparedStatements="true"
initialSize="25"
maxActive="100"
maxIdle="100"
minIdle="25"
username="us"
password="pa"
driverClassName="com.mysql.jdbc.Driver"
validationQuery="select 1"
testOnBorrow="true"
url="jdbc:mysql://localhost:3306/firstproject?useUnicode=true&characterEncoding=UTF-8&profileSQL=false&autoSlowLog=false&slowQueryThresholdMillis=100&autoReconnect=true"/>
したがって、Tomcat 7では問題なく動作します。 Tomcat 8では、この問題を2つの方法で解決できます。
singleton = "false";
factory="org.Apache.Tomcat.jdbc.pool.DataSourceFactory"
Tomcatがアプリとjmxのデータソースを作成することを明確に理解しているのに、Tomcat 7では単一のオブジェクトでしたが、Tomcat 8では異なる必要があります。だから私の質問は、なぜそのような状況が起こったのですか?ドキュメントにこの変更の情報が見つかりませんでした。そして、私は興味深いのですが、単一のデータソースを作成する(そう思う)か、工場で複数のデータソースを作成します。
同じ問題がありました。データソースをSpring Beanとして宣言しましたが、SpringとBeanの両方がMBeanを登録しようとしているため、この競合が発生しています。 Mbean Exporterを次のように構成するだけです。
@Bean
public AnnotationMBeanExporter annotationMBeanExporter() {
AnnotationMBeanExporter annotationMBeanExporter = new AnnotationMBeanExporter();
annotationMBeanExporter.addExcludedBean("dataSource");
return annotationMBeanExporter;
}
登録ポリシーを次のように設定するとしますが、
annotationMBeanExporter.setRegistrationPolicy(RegistrationPolicy.IGNORE_EXISTING);
うまくいくかもしれません。
同じエラーが発生し、mbean-export部分にregistration = "ignoreExisting"を追加して解決しました。
<context:mbean-export server="mbeanServer" default-domain="mydomain" registration="ignoreExisting" />
アノテーションを使用したソリューションが必要な場合は、SpringブートですでにMBeanExporter Beanが定義されているため、自動でワイヤリングできます。
@Autowired
MBeanExporter mBeanExporter ;
次に、登録ポリシーを変更します
mBeanExporter.setRegistrationPolicy(RegistrationPolicy.IGNORE_EXISTING);
誰かがapplicationContext.xmlスタイルを使用している場合、私はこのように問題を解決しました:
<bean id="myNamedExporter" class="org.springframework.jmx.export.MBeanExporter">
<property name="registrationPolicy" value="IGNORE_EXISTING" />
</bean>