サーブレットでアクセスできるように、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() はそれほど高価ではないので、私はそのようにしています。私にとってはかなりうまく機能します