2017-02-03 19 views
1

Tomcat 8.0で動作するJava 8 Webアプリケーションがあります。以下の方法で、プロジェクトで定義されたコンテキスト・リスナー・クラスは、あります:Tomcat 8のコンテキストが2回初期化される

クラス:

public class ...ContextListener implements ServletContextListener { 
    private static Log log = LogFactory.getLog(...ContextListener.class); 

    public void contextInitialized(ServletContext sce) { 
     log.info("HOSTNAME:" + ...Utils.getHostName()); 
     ... 
    } 
} 

のweb.xml:アプリケーションを起動すると、私がログに表示さ

<web-app ...> 
    <listener> 
     <listener-class>...ContextListener</listener-class> 
    </listener> 
</web-app> 

コンテキストリスナクラス(およびコンテキストリスナによってインスタンス化された他のすべてのクラス)のすべてのログメッセージが2回出力されることを確認してください:

03/02/2017 17:47:07 INFO - HOSTNAME:...win 
03/02/2017 17:47:07 INFO - HOSTNAME:...win 
03/02/2017 17:47:07 INFO - Starting Coordinator ... 
03/02/2017 17:47:07 INFO - Starting Coordinator ... 
03/02/2017 17:47:07 INFO - Coordinator.start was called 
03/02/2017 17:47:07 INFO - Coordinator.start was called 
03/02/2017 17:47:07 INFO - Coordinator was started! 
03/02/2017 17:47:07 INFO - Coordinator was started! 
03/02/2017 17:47:11 INFO - Setting the workCounter=0 
03/02/2017 17:47:11 INFO - Setting the workCounter=0 

私のアプリケーションでは、1つのCoordinatorスレッドを起動することになっているので、これはひどいことです。

私はTomcatの設定ガイドを読んでみましたが、autoDeployプロパティとdeployOnStartupプロパティだけでなく、さまざまなコンテキスト設定を使って遊んでみましたが、役に立たなかった。

のTomcat/confに/ context.xmlに:

<Context> 
    .... 
    <WatchedResource>WEB-INF/web.xml</WatchedResource> 
    <WatchedResource>${catalina.base}/conf/web.xml</WatchedResource> 
    <ResourceLink name="..." global="..." type="javax.sql.DataSource"/> 
    <ResourceLink name="..." global="..." type="javax.sql.DataSource"/> 
    <ResourceLink name="..." global="..." type="javax.sql.DataSource"/> 
    <ResourceLink name="..." global="..." type="javax.sql.DataSource"/> 
    <ResourceLink name="..." global="..." type="javax.sql.DataSource"/> 
    ... 
</Context> 

リソースリンクタグは、このアプリケーションのためだけでなく、いくつかの他のアプリケーションのためのJDBCデータソースです。

のTomcat/CONF/server.xmlの:

<Server port="9006" shutdown="SHUTDOWN"> 
    <Listener className="org.apache.catalina.startup.VersionLoggerListener" /> 
    <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" /> 
    <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" /> 
    <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" /> 
    <Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" /> 
    <GlobalNamingResources> 

<Resource name="UserDatabase" auth="Container" 
       type="org.apache.catalina.UserDatabase" 
       description="User database that can be updated and saved" 
       factory="org.apache.catalina.users.MemoryUserDatabaseFactory" 
       pathname="conf/tomcat-users.xml" /> 

    <Resource name="..." auth="Container" type="javax.sql.DataSource" 
      factory="...EncryptedDataSourceFactory" 
      username="..." password="..." 
      driverClassName="oracle.jdbc.driver.OracleDriver" 
      url="..." maxWait="1000" removeAbandoned="true" 
      maxActive="100" maxIdle="5" removeAbandonedTimeout="60" 
      logAbandoned="true" validationQuery="SELECT 1 from DUAL" 
      testOnBorrow="true" testWhileIdle="true" numTestsPerEvictionRun="3" timeBetweenEvictionRunsMillis="30000" 
      minEvictableIdleTimeMilli="150000" defaultAutoCommit="true"/>  

    <Resource name="..." auth="Container" type="javax.sql.DataSource" 
      factory="...EncryptedDataSourceFactory" 
      username="..." password="..." 
      driverClassName="oracle.jdbc.driver.OracleDriver" 
      url="..." maxWait="1000" removeAbandoned="true" 
      maxActive="100" maxIdle="5" removeAbandonedTimeout="60" 
      logAbandoned="true" validationQuery="SELECT 1 from DUAL" 
      testOnBorrow="true" testWhileIdle="true" numTestsPerEvictionRun="3" timeBetweenEvictionRunsMillis="30000" 
      minEvictableIdleTimeMilli="150000" defaultAutoCommit="true"/> 

    </GlobalNamingResources> 

    <Service name="Catalina"> 
    <Connector port="9081" protocol="HTTP/1.1" 
       connectionTimeout="20000" 
       redirectPort="9444" /> 

    <Connector port="9010" protocol="AJP/1.3" redirectPort="9444" /> 

    <Engine name="Catalina" defaultHost="localhost"> 

     <Realm className="org.apache.catalina.realm.LockOutRealm"> 
     <Realm className="org.apache.catalina.realm.UserDatabaseRealm" 
       resourceName="UserDatabase"/> 
     </Realm> 

     <Host name="localhost" appBase="webapps" unpackWARs="true"> 
     <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" 
       prefix="localhost_access_log" suffix=".txt" 
       pattern="%h %l %u %t &quot;%r&quot; %s %b" /> 

     </Host> 
    </Engine> 
    </Service> 
</Server> 

それは完全に "オリジナル" である(このサーバ上で実行されている他のTOMCATSがあるため)、ポートのみが変更されています。

アプリケーション自体にcontext.xmlファイルが含まれていないため、コンテキストが2回初期化された理由を理解できません。見知らぬ人でも、Tomcat 7ではそれは起こりませんでした。プロジェクトのJavaバージョンを8に、Tomcatバージョンを8に変更しました。

私はあなたが提供できるお役に立てていただきありがとうございます。

+0

すべてのログエントリは重複していますか?あなたが示した部分のように見えます。 – stdunbar

+0

デバッグモードで起動し、確実にブレークポイントを設定します。 –

+0

はい、すべてのログエントリが複製されます。私は8.5 Tomcat上の私のコンピュータ上の問題を再現することができました(ターゲットシステムは8.0 Tomcatを持っています)。 –

答えて

0

pedrofbのコメントのおかげで、重複した初期化ではなく、重複したログエントリがあることに気付きました。 log4jの設定は次のようになっています:

log4j.logger...package.subpackage1=INFO,LOGFILE 
log4j.logger...package.subpackage2=INFO,LOGFILE 

log4j.appender.LOGFILE=org.apache.log4j.RollingFileAppender 
... 

それでログメッセージが2回出現しました。

関連する問題