Tomcat - Servlet init()在启动时调用了两次

时间:2011-09-04 17:54:33

标签: tomcat servlets init

我遇到了独立Tomcat服务器的问题(未与Apache链接)。

当Tomcat启动时,servlet的init()方法被调用两次,即两个servlet正在启动。更令人担心的是,这些似乎是由不同的类加载器加载的 - 命令行上只运行一个Java进程,因此它不是多个Tomcats。

web.xml片段(servlet仅配置一次,并且仅在webapp web.xml中配置):

<servlet>
  <servlet-name>LenderInterfaceServlet</servlet-name>
  <display-name>Lender Interface Servlet</display-name>
  <servlet-class>com.foobar.lender.webservice.server.LenderInterfaceServlet</servlet-class>
  <load-on-startup>1</load-on-startup>
</servlet>

我在init方法中添加了一些日志记录,并创建了一个名为RatesPoller的单例类,init尝试获取其实例。从日志中我们可以看到单例实例是不同的:

LenderInterfaceServlet - [init] Start: com.foobar.lender.webservice.server.LenderInterfaceServlet@56d90453
LenderInterfaceServlet - [init] Starting up the Rates pollers.
LenderInterfaceServlet - [init] Got com.foobar.lender.framework.rates.RatesPoller@ae0e515
LenderInterfaceServlet - [init] Start: com.foobar.lender.webservice.server.LenderInterfaceServlet@1b0c6cfc
LenderInterfaceServlet - [init] Starting up the Rates pollers.
LenderInterfaceServlet - [init] Got com.foobar.lender.framework.rates.RatesPoller@5759780d

所以我们有两个不同的servlet和两个不同的单一轮询器。

我怀疑这意味着Tomcat正在启动存储在Tomcat webapps文件夹中的两个webapp实例。显然当你想要启动只有一个将运行的东西时,这是一个问题,我需要弄清楚如何确保Tomcat不会运行两次webapp!

如果有人有任何想法......

代码:

public class RatesPoller {

  private static RatesPoller instance;

  private RatesPoller() {}

  public static RatesPoller getInstance() {
    if (instance == null) {
        instance = new RatesPoller();
    }
    return instance;
  }

  public RatesPoller clone() throws CloneNotSupportedException {
    throw new CloneNotSupportedException("Singleton. Tsk!");
  }
}

和LenderInterfaceServlet中的init()方法:

public class LenderInterfaceServlet extends AxisServlet {
  // ...
  @Override
  public void init() throws ServletException {
    logger.info("[init] Start: " + this);
    super.init();
    logger.info("[init] Starting up the Rates pollers.");
    RatesPoller rp = RatesPoller.getInstance();
    logger.info("[init] Got " + rp);
  }
  // ...
}

3 个答案:

答案 0 :(得分:4)

Tomcat在webapps中自动部署任何内容,并根据server.xml进行部署。只需从webapps中删除您的webapp即可避免双重加载。

答案 1 :(得分:0)

我会在init()方法中设置一个断点,然后查看堆栈以查看调用的来源。

答案 2 :(得分:-1)

如果init()方法失败,可能会在后续get中再次调用它。您是否检查了catalina.out文件以确保init()调用由于某种原因没有被中止?