ServletContextListener在Tomcat中的配置问题

fufan 2007-03-18 11:34:00
我的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,是这样的么??
...全文
1221 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
fufan 2007-04-09
  • 打赏
  • 举报
回复
to daniel_kaka() :放前面不行。试过了。

to stone1982(强) :不设置为 listener设置为什么?具体怎么修改listener为servlet?修改为servlet不就不能定时执行任务了吗?
stone1982 2007-04-08
  • 打赏
  • 举报
回复
原因分析: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送分吧 :)
daniel_kaka 2007-04-07
  • 打赏
  • 举报
回复
你把
<listener>
<listener-class>com.mission.init.SysContextListener</listener-class>
</listener>
放到 <servlet> 上面,
标准的写法是<listener>在<servlet>前面,
再试一试看看行不行~

另外,给你提一个计划任务的方法,使用Quartz,不需要配置监听器,只要写在代码里就可以了~
fufan 2007-04-07
  • 打赏
  • 举报
回复
还没解决。继续寻找答案。

请问在tomcat中嵌入一个定时任务,任务中访问数据库,不能通过数据源连接访问吗?怎么才能访问数据库?
craig_wolfdon 2007-03-19
  • 打赏
  • 举报
回复
在带有监听器的servlet中,执行的顺序是这样的,首先建立servletListerner,然后运行,初始化ServletContext,然后监听ServletContext的变化,最后ServletContext被销毁,加ServletListener的时候不用添加其他的什么配置只在web.xml里面加上监听器就可以了,我不知道是什么错误,供你参考把,
marine_chen 2007-03-19
  • 打赏
  • 举报
回复
把顺序换一换就行了
fufan 2007-03-18
  • 打赏
  • 举报
回复
在listner中设置优先级有用么?这个参数<load-on-startup>只能设置servlet的优先级吧,我的servlet是没有问题的。

我也试了你说的方法了,把那个listner的优先级设置高了,还是无用。


<listener>
<listener-class>com.mission.init.SysContextListener</listener-class>
<load-on-startup>2</load-on-startup>
</listener>
www203 2007-03-18
  • 打赏
  • 举报
回复
如果是你的分析原因
我记得servlet可以设置优先级的
或许可以把serlet的启动优先级设高一点
让他优先运行
<load-on-startup>1</load-on-startup>

也就是这个参数

81,094

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧