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 🙂
InformationsquelleAutor JeeBee | 2011-09-04
Schreibe einen Kommentar