2013-02-09 20 views
4

我需要在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()'不是真的很貴,我這樣做的方式,它的工作原理非常適合我

+0

您創建另一個InitialContext。他們並不昂貴。 – bmargulies 2013-02-11 12:13:29

回答

4

閱讀Tomcat中的JNDI配置。該文檔是here。您可以定義要創建的對象,只需查看一次即可。

+0

好的,我創建了一個InitialContext。那麼如何從其他servlet調用我的Singleton呢?新的InitialContext()會消耗很多內存嗎? – gabrieltnishimura 2013-02-11 04:22:15

+0

不,不是很多。你必須按照其他的說明來了解如何在server.xml上配置你的單例並將其從背景中解脫出來。 – bmargulies 2013-02-11 12:13:05

+0

好吧,我成功地創建了很多上下文,並從中獲取我的單例。謝謝 – gabrieltnishimura 2013-02-12 20:23:17

1

或者,您可以定義一個監聽Servlet上下文初始化事件的Servlet Listener。當初始化servlet時,您可以創建對象並將其存儲在Servlet上下文中。每個servlet都可以通過servlet上下文訪問這個對象並使用它。

0

或者,您可以使用啓動servlet來初始化web.xml中定義的<load-on-startup>1</load-on-startup>的單例。

相關問題