2013-02-09 19 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>的单例。

相关问题