Tomcat - Servlet init() zweimal aufgerufen beim Start
Ich habe ein Problem mit einem standalone Tomcat-server (nicht verbunden mit Apache).
Wenn Tomcat startet, wird die init () - Methode des Servlets wird immer zweimal aufgerufen, D. H., zwei servlets sind der Inbetriebnahme. Noch besorgniserregender ist, dass diese erscheinen werden geladen, die von verschiedenen classloadern - es ist nur ein Java-Prozess läuft auf der Kommandozeile, damit es nicht mehrere Kater.
web.xml snippet (das servlet wird nur einmal konfiguriert, und nur konfiguriert in der 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>
Habe ich einige der Protokollierung in der init-Methode und erstellt eine singleton-Klasse namens RatesPoller, dass das init versucht, eine Instanz. Aus den Balken, können wir sehen, dass die singleton-Instanzen sind anders:
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
Wir haben also zwei distince servlets und zwei unterschiedliche singleton-Abrufe.
Ich vermute, das bedeutet, dass Tomcat starten Sie zwei Instanzen von der webapp gespeichert ist, in den webapps-Ordner von Tomcat. Natürlich, wenn Sie wollen etwas starten, dass nur eine ausgeführt wird, ist das ein problem, und ich müssen herausfinden, wie Sie sicherstellen, dass der Tomcat nicht läuft die webapp zweimal!
Wenn jemand eine Idee hat ...
Code:
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!");
}
}
und die init () - Methode in LenderInterfaceServlet:
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);
}
//...
}
"Singleton. Tsk!"
made my day 🙂
Du musst angemeldet sein, um einen Kommentar abzugeben.
Tomcat ist autodeploying alles in webapps, und auch die Bereitstellung von nach server.xml. Entfernen Sie einfach Ihre webapp von webapps zur Vermeidung einer Doppel-Belastung.
Es ist ein Fehler in deinem code. Das singleton ist nicht thread-safe. Dass getInstance () - Methode synchronisiert werden sollten. Sonst sind Sie haftbar zu konstruieren, die mehrere Instanzen.
Ich würde setzen Sie einen breakpoint in der Methode init() und suchen Sie dann auf dem Stapel, um zu sehen, wo die Anrufe herkommen.
Wenn der init () - Methode fehlschlägt, kann erneut aufgerufen werden, auf eine nachträgliche bekommen. Haben Sie die catalina.aus Datei, um sicherzustellen, dass die init () - Aufruf ist nicht abgetrieben zu werden, aus irgendeinem Grund?