ServletContextListener在Tomcat中的配置问题
我的web.xml配置如下,用的是proxool进行数据库连接:
<servlet>
<servlet-name> proxoolServletConfigurator </servlet-name>
<servlet-class> org.logicalcobwebs.proxool.configuration.ServletConfigurator </servlet-class>
<init-param>
<param-name> xmlFile </param-name>
<param-value> WEB-INF/proxool.xml </param-value>
</init-param>
<load-on-startup> 1 </load-on-startup>
</servlet>
<servlet>
<servlet-name> proxoolAdmin </servlet-name>
<servlet-class> org.logicalcobwebs.proxool.admin.servlet.AdminServlet </servlet-class>
</servlet>
<servlet-mapping>
<servlet-name> proxoolAdmin </servlet-name>
<url-pattern> /proxooladmin </url-pattern>
</servlet-mapping>
<listener>
<listener-class> com.mission.init.SysContextListener </listener-class>
</listener>
在里面配置了一个tomcat监听器,监听器执调用Java的TimerTask执行一个定时任务。未配置监听器的时候tomcat都是可以正常启动,数据库连接池也是建立好了的,但就是配置了这个监听器之后,每次tomcat启动的时候都要报错,出错信息如下:
org.logicalcobwebs.proxool.ProxoolException: Attempt to refer to a unregistered pool by its alias 'Develop '
at org.logicalcobwebs.proxool.ConnectionPoolDefinition.doChange(Connecti
onPoolDefinition.java:250)
at org.logicalcobwebs.proxool.ConnectionPoolDefinition. <init> (Connection
PoolDefinition.java:147)
at org.logicalcobwebs.proxool.ProxoolFacade.registerConnectionPool(Proxo
olFacade.java:96)
at org.logicalcobwebs.proxool.ProxoolDriver.connect(ProxoolDriver.java:7
7)
其中那个Develop是我在proxool.xml中配置的别名,是没有问题的。而且,tomcat也可以启动,也可以正常访问数据库。
经我的分析觉得可能是因为前面那个servlet即数据库连接还没有建立的时候监听器就已经初始化了,因此一直都是报没有注册连接池的错误。
请问这个问题如何解决??tomcat是先执行listner再执行servlet,是这样的么??
[解决办法]
如果是你的分析原因
我记得servlet可以设置优先级的
或许可以把serlet的启动优先级设高一点
让他优先运行
<load-on-startup> 1 </load-on-startup>
也就是这个参数
[解决办法]
把顺序换一换就行了
[解决办法]
在带有监听器的servlet中,执行的顺序是这样的,首先建立servletListerner,然后运行,初始化ServletContext,然后监听ServletContext的变化,最后ServletContext被销毁,加ServletListener的时候不用添加其他的什么配置只在web.xml里面加上监听器就可以了,我不知道是什么错误,供你参考把,
[解决办法]
你把
<listener>
<listener-class> com.mission.init.SysContextListener </listener-class>
</listener>
放到 <servlet> 上面,
标准的写法是 <listener> 在 <servlet> 前面,
再试一试看看行不行~
另外,给你提一个计划任务的方法,使用Quartz,不需要配置监听器,只要写在代码里就可以了~
[解决办法]
原因分析:LZ的目的是要在自己定义的定时器中操作数据库,但是对于tomcat的listener节点
而言,这个监听器就不是你所期望的那样了,listener的执行先于servlet,
在每次调用servlet的时候都会触发listener。
解决办法:将配置数据源的proxoolServletConfigurator这个servlet不变,
并且设置load-on-startup为1,正如楼上说的那样;去掉listener,
并将其修改为一个servlet,同样设置load-on-startup节点,但是节点值大于1,
即定时任务servlet的优先级低于配置数据源的servlet。因为所谓的监听其实是
你自己的定时任务在执行,而不是使用tomcat的listener,所以不应该设置为
listener.
LZ送分吧 :)