我遇到了独立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);
}
// ...
}
答案 0 :(得分:4)
Tomcat在webapps中自动部署任何内容,并根据server.xml进行部署。只需从webapps中删除您的webapp即可避免双重加载。
答案 1 :(得分:0)
我会在init()方法中设置一个断点,然后查看堆栈以查看调用的来源。
答案 2 :(得分:-1)
如果init()方法失败,可能会在后续get中再次调用它。您是否检查了catalina.out文件以确保init()调用由于某种原因没有被中止?