4

我需要在 Apache Tomcat 启动时创建一个单例,以便我可以使用 servlet 访问它们。单例定义 servlet 将给出什么响应。

我想知道 tomcat 是否有构造函数,以便我可以添加代码以便可以创建单例。

*编辑:经过一番搜索,我发现我可以尝试使用网络服务(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);
        }
    }

最后是 servlet 中的 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() 的情况下从另一个 servlet 调用这些方法

编辑:由于 new InitialContext() 并不是很贵,所以我这样做,它对我来说效果很好

4

3 回答 3

4

阅读 Tomcat 中的 JNDI 配置。文档在这里。您可以定义一个在查找时创建的对象。

于 2013-02-09T22:38:12.017 回答
1

或者,您可以定义一个Servlet 侦听器来侦听 Servlet 上下文初始化事件。servlet 初始化后,您可以创建对象并将其存储在 Servlet 上下文中。您的每个 servlet 都可以通过 servlet 上下文访问该对象并使用它。

于 2013-02-09T22:43:18.017 回答
1

或者,您可以使用启动 servlet 来初始化<load-on-startup>1</load-on-startup>web.xml 中定义的单例。

于 2013-02-10T05:15:26.210 回答