2017-02-03 4 views
1

Ich habe Web-Anwendung eine Java 8 auf Tomcat 8.0 ausgeführt wird initialisiert. Es gibt einen Kontext-Listener-Klasse im Projekt definiert ist, auf folgende Weise:Tomcat 8 Kontext zweimal

Klasse:

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> 

Wenn das Programm gestartet ist, ich in den Protokollen sehen dass jede Protokollnachricht in der Kontext-Listener-Klasse (und in jeder anderen vom Kontext-Listener instanziierten Klasse) zweimal gedruckt wird:

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 

Das ist schrecklich für meine Anwendung, weil es angeblich einen einzigen Koordinator Thread zu starten, die wiederum (wie der Name schon sagt) werden andere, verschiedene Threads koordinieren.

Ich habe versucht, Tomcat Konfigurationsanleitung zu lesen und versuchte mit AutoDeploy und deployOnStartup Eigenschaften sowie anderen Kontext-Setups, aber ohne Erfolg herumspielen.

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> 

Die Resource Tags JDBC-Datenquellen für diese Anwendung sowie für einige andere Anwendungen.

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> 

Es ist komplett "Original", nur die Ports geändert werden (weil es andere Kater sind auf diesem Server ausgeführt wird).

Die Anwendung selbst enthält keine context.xml Datei, so dass ich nicht wirklich verstehen, warum der Kontext zweimal initialisiert wird. Noch seltsamer, auf Tomcat 7 ist es nicht passiert, alles, was ich jetzt tat, war, die Java-Version des Projekts auf 8 und Tomcat auf 8 zu ändern.

Ich würde mich über jede Hilfe freuen, die Sie anbieten könnten.

+0

dupliziert alle Log-Einträge? Es sieht aus wie der Teil, den du gezeigt hast. – stdunbar

+0

Starten Sie es im Debug-Modus, und setzen Sie einen Haltepunkt, um sicher zu sein. –

+0

Ja, alle Protokolleinträge sind doppelt vorhanden. Ich habe es geschafft, das Problem auf meinem Computer auch auf einem Tomcat 8.5 zu reproduzieren (Zielsystem hat 8.0 Tomcat). –

Antwort

0

Dank pedrofb Kommentar, erkannte ich, ich nur doppelte Protokolleinträge hatte, und nicht die doppelte Initialisierung. Die log4j Konfiguration war wie folgt aus:

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

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

Und deshalb Logmeldungen zweimal erschienen.