2017-02-03 9 views
1

У меня есть веб-приложение Java 8, работающее на Tomcat 8.0. Существует класс контекста слушателя определен в проекте, следующим образом:Контекст Tomcat 8 инициализирован дважды

Класс:

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> 

При запуске приложения, я вижу в журналах что каждое сообщение журнала в классе слушателя контекста (и в каждом другом классе, создаваемом слушателем контекста) печатается дважды:

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 

Это ужасно для моего приложения, потому что предполагается запустить одну цепочку координаторов, которая, в свою очередь, (как следует из названия) будет координировать другие, разные потоки.

Я пробовал читать руководство по конфигурации 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> 

Теги ResourceLink являются 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> 

Это полностью "оригинальный", только порты меняются (потому что есть другие коты, работающие на этом сервере).

Само приложение не содержит файл context.xml, поэтому я действительно не понимаю, почему контекст инициализируется дважды. Даже незнакомец, на 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 
... 

И вот почему сообщения журнала появились дважды.