4

サーブレットでアクセスできるように、Apache Tomcat の起動時にシングルトンを作成する必要があります。シングルトンは、サーブレットが返す応答を定義します。

シングルトンを作成できるようにコードを追加できるように、Tomcat にコンストラクターがあるかどうかを知りたかったのです。

*編集: 少し検索したところ、Web サービス (JAX-WS) を使用できることがわかりました。ただし、jvmがWebサービスのインスタンスをどのように扱うかはわかりません。WS への異なる接続で同じオブジェクトにアクセスできますか?

これらのリソースをweb.xml記述子に追加する bmargulies ソリューションを使用しました。

<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>

これをcontext.xmlに:

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

シングルトン クラスを作成しました。

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

シングルトン「ファクトリー」を作成しました:

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);
        }
    }

最後に、これをサーブレットの get 関数に渡します。

    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();
    }

私の問題は、新しい InitialContext() を作成せずに、別のサーブレットからこれらのメソッドを呼び出す方法を知ることです

編集: new InitialContext() はそれほど高価ではないので、私はそのようにしています。私にとってはかなりうまく機能します

4

3 に答える 3

4

Tomcat の JNDI 構成について調べてください。ドキュメントはこちらです。ルックアップ時に一度だけ作成されるオブジェクトを定義できます。

于 2013-02-09T22:38:12.017 に答える
1

または、起動サーブレットを使用して<load-on-startup>1</load-on-startup>、web.xml で定義されたシングルトンを初期化することもできます。

于 2013-02-10T05:15:26.210 に答える
1

または、サーブレットコンテキストの初期化イベントをリッスンするサーブレットリスナーを定義できます。サーブレットが初期化されると、オブジェクトを作成してサーブレット コンテキストに格納できます。各サーブレットは、サーブレット コンテキストを介してこのオブジェクトにアクセスし、それを使用できます。

于 2013-02-09T22:43:18.017 に答える