spring context初始化两次,以及bean两次建立,以及其形成dubbo端口被占用Failed to bind NettyServer,以及其余重复建立对象等问题

当项目被部署到tomcat的webapps目录下时,会出现spring context初始化两次,以及bean两次建立,以及其形成dubbo端口被占用Failed to bind NettyServer,以及其余重复建立对象等问题。java

1. 具体表现:

  1. Spring打印2次初始化日志
/*Spring 打印2次初始化日志
Initializing Spring root WebApplicationContext
      ......
Initializing Spring root WebApplicationContext
*/
  1. 数据库会多一倍的链接
--查询数据库链接
--oracle
select sess.sid,sess.serial#,sess.machine,
lo.oracle_username,lo.os_user_name,
ao.object_name,lo.locked_mode from v$locked_object lo,
dba_objects ao,v$session sess  
where ao.object_id = lo.object_id and lo.session_id = sess.sid;
--mysql
select host, count(host) from information_schema.processlist;
--mysql也能够直接status查看状态
status
  1. 使用Dubbo时,启动时会出现出现Failed to bind NettyServer异常(即dubbo 注册了两次,dubbo端口被占用 )
/* 项目启动异常绑定某个IP:PORT失败,该端口已经被占用
Caused by: com.alibaba.dubbo.remoting.RemotingException: Failed to bind NettyServer on /10.0.15.163:20892, cause: Failed to bind to: /0.0.0.0:20892
      ......
Caused by: org.jboss.netty.channel.ChannelException: Failed to bind to: /0.0.0.0:20892
      ......
Caused by: java.net.BindException: Address already in use: bind
      ......
*/
  1. 定时任务,或某个明确要求单例的对象却实例出了两个对象,单例bean打印了2次建立日志等
/*某个单例对象,打印了2次对象建立日志
[localhost-startStop-1] DEBUG 单例对象XXX建立成功!
[localhost-startStop-1] DEBUG Creating instance of bean 'beanName'
[localhost-startStop-1] DEBUG Creating shared instance of singleton bean 'beanName2'
      .........
[localhost-startStop-1] DEBUG 单例对象XXX建立成功!
[localhost-startStop-1] DEBUG Creating instance of bean 'beanName'
[localhost-startStop-1] DEBUG Creating shared instance of singleton bean 'beanName2'
      .........
*/

2. 缘由:

  • server.xml中Host节点的autoDeploy属性表示是否开启热部署,deployOnStartup属性表示是否启动时部署
  • 但Tomcat自身热部署并不完善
  • 启用热部署webapps时会出现部署2次的状况,新加入war包等同于改动,tomcat在扫描改动时, 再次把webapps下的web应用给部署进来

3. 解决办法:

  1. 修改项目所在tomcat所使用的server.xml中appBase="webapps"的Host节点的autoDeploy属性和deployOnStartup属性为false
<!--关闭Tomcat热部署和启动部署(能够不关deployOnStartup)以免两次部署,此时须要手动部署-->
<Host appBase="webapps" autoDeploy="false" deployOnStartup="false" name="localhost" unpackWARs="true">
  <!--内部节点-->
  <Context/>
</Host>
  1. 将项目发布到tomcat\webapps\ROOT目录下mysql

  2. 修改项目的Deploy Path为除了tomcat\webapps之外的其余文件夹,如tomcat\myapp(这个方法对于Eclipse启动Tomcat来讲最方便实用)nginx

  3. 使用nginx指向tomcatweb

相关文章
相关标签/搜索