Jak mogę utworzyć singleton w starcie Apache Tomcat

Muszę utworzyć singleton, gdy uruchamia się Apache Tomcat, dzięki czemu mogę uzyskać do nich dostęp za pomocą serwletów. Singleton określa, jaką reakcję będą dawały serwlety.

Chciałem wiedzieć, czy kocur ma konstruktora, więc mogę dodać kod, aby można było utworzyć singleton.

* edit: po krótkim przeszukiwaniu odkryłem, że mogę spróbować użyć usługi internetowej (JAX-WS). Nie wiem jednak, jak jvm traktuje instancje w serwisie WWW. Czy mogę uzyskać dostęp do tego samego obiektu na różnych połączeniach z WS?

Użyłem rozwiązania bmargulies dodając te zasoby doweb.xml deskryptor:

<resource-env-ref>
  <description>
     Factory for the Arduino Connection
  </description>
  <resource-env-ref-name>
     arduino/ArduinoConnectionFactory
  </resource-env-ref-name>
  <resource-env-ref-type>
     br.com.evans.jndi.basic.ArduinoConnection
  </resource-env-ref-type>
</resource-env-ref>

To docontext.xml:

<Context>
  <Resource name="arduino/ArduinoConnectionFactory" auth="Container"
        type="br.com.evans.jndi.basic.ArduinoConnection"
        factory="br.com.evans.jndi.basic.ArduinoConnectionFactory"/>
</Context>

Utworzono klasę singleton:

public enum ArduinoConnection implements SerialPortEventListener {
    INSTANCE;
    public void initialize() {...}
}

Utworzono singletonową „fabrykę”:

public class ArduinoConnectionFactory implements ObjectFactory {

    public ArduinoConnectionFactory() {
        ArduinoConnection.INSTANCE.initialize();
        try {
            Thread.sleep(1800);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    public Object getObjectInstance(Object obj, Name name, 
        Context nameCtx,Hashtable environment) throws NamingException {
            // Return the customized instance
            return (ArduinoConnection.INSTANCE);
        }
    }

i wreszcie do funkcji get w serwletu:

    Context initCtx;
    try {
        initCtx = new InitialContext();
        Context envCtx = (Context) initCtx.lookup("java:comp/env");
        ArduinoConnection arduino = (ArduinoConnection) envCtx.lookup("arduino/ArduinoConnectionFactory");
        arduino.doSomething();
    } catch (NamingException e) {
        System.out.println("Something went wrong!");
        e.printStackTrace();
    }

Moim problemem jest teraz wiedzieć, jak wywołać te metody z innego serwletu bez tworzenia nowego InitialContext ()

Edytować: Ponieważ nowy InitialContext () nie jest naprawdę drogi, robię to w ten sposób, działa dla mnie bardzo dobrze

questionAnswers(3)

yourAnswerToTheQuestion