我需要在Apache Tomcat啓動時創建一個單例,以便我可以使用servlet訪問它們。單例定義了servlet會給出什麼樣的響應。如何在Apache Tomcat啓動時創建單例
我想知道是否tomcat有一個構造函數,所以我可以添加代碼,以便可以創建單例。
*編輯:搜索一下後,我發現我可以嘗試使用Web服務(JAX-WS)。 雖然我不知道jvm如何處理web服務中的實例。我可以通過與WS的不同連接訪問相同的對象嗎?
我用bmargulies解決方案添加這些資源到的web.xml描述:
<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函數在一個servlet:
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();
}
我現在的問題是要知道我怎麼從另一個調用servlet的那些方法未做一個新的InitialContext()
編輯:由於新的InitialContext()'不是真的很貴,我這樣做的方式,它的工作原理非常適合我
您創建另一個InitialContext。他們並不昂貴。 – bmargulies 2013-02-11 12:13:29