spring context 初始化两次导致dub…

来源:互联网 发布:pp助手 mac 编辑:程序博客网 时间:2024/06/05 18:29

背景:一个刚开发完的小项目部署到测试环境,总是部署失败,直观的报错是error日志中有dubbo端口被占用。项目为springmvc框架+tomcat。

错误日志为:


spring <wbr>context <wbr>初始化两次导致dubbo端口被占用(memory <wbr>leak内存泄漏错误)


继续找日志,tomcat日志,应用的error日志,都已经看了,那只剩下应用的info日志了。没办法大量的info日志,一条一条读吧。

还真让我发现了问题!!

 

 


spring <wbr>context <wbr>初始化两次导致dubbo端口被占用(memory <wbr>leak内存泄漏错误)

spring <wbr>context <wbr>初始化两次导致dubbo端口被占用(memory <wbr>leak内存泄漏错误)


Root WebApplicationContext启动了两次,第二次报错了,容器关闭。启动两次,这就可以理解为什么dubbo端口怎么改都会被占用了。

那么问题来了,为什么会启动两次呢?本地跑是正常的呀。

比较了应用配置,和其他能够正常启动的应用也是一样的。

就随便看看tomcat配置吧,比较下同一台测试机器上的两个应用,一个是有问题的,一个是正常的。

还真不太一样,在server.xml:

正常的:


     unpackWARs="true" deployOnStartup="false"
     xmlValidation="false" xmlNamespaceAware="false" >
 

不正常的:


     unpackWARs="true" deployOnStartup="true"
     xmlValidation="false" xmlNamespaceAware="false" >
 

这两个配置不知道具体什么含义,先改成和正常的一样试试吧。

改了,还真就正常了,springcontext只启动一次,dubbo端口也不再被占用。

那么下边来查查tomcatserver.xml中,autoDeploy和deployOnStartup的含义。

摘抄:

http://www.cnblogs.com/ywl925/archive/2013/02/28/2936926.html
autoDeploy:如果此项设为true,表示Tomcat服务处于运行状态时,能够监测appBase下的文件,如果有新有web应用加入进来,会自运发布这个WEB应用
unpackWARs:如果此项设置为true,表示把WEB应用的WAR文件先展开为开放目录结构后再运行.如果设为false将直接运行为WAR文件
 deployOnStartup:如果此项设为true,表示Tomcat服务器启动时会自动发布appBase目录下所有的Web应用.如果Web应用中的server.xml没有相应的元素,将采用Tomcat默认的Context

 

http://kalogen.iteye.com/blog/910326

如果将autoDeploy设置为true,就会发生再次部署的现象,第一次因server.xml中的Context配置而被部署(因为deployOnstartup="true"),

而第二次因autoDeploy被设置为true而发生自动部署(默认情况下,在没有显式Context的这些属性时,它们每个的默认值都是true)。

显式设置autoDeploy为False。避免了在server.xml中增加Context配置时两次部署相同的Web应用程序。


=================关于上述问题的其它解决方案==============================================

除了修改tomcat的部署配置文件server.xml以外,如果是两个项目在同一个tomcat里启动(生产者provider---消费者consumer模型,即:服务的提供者和使用者),或者可以将使用的两个项目部署在不同的tomcat里,仅需要修改server.xml中的HTTP协议端口8080,AJP协议端口8009以及用来SHUTDOWN的关闭端口8005为其它未使用的端口就行。



原创粉丝点击