我需要在 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() 并不是很贵,所以我这样做,它对我来说效果很好