Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在ApacheTomcat启动程序中创建单例_Java_Web Services_Apache_Constructor_Singleton - Fatal编程技术网

Java 如何在ApacheTomcat启动程序中创建单例

Java 如何在ApacheTomcat启动程序中创建单例,java,web-services,apache,constructor,singleton,Java,Web Services,Apache,Constructor,Singleton,我需要在ApacheTomcat启动时创建一个单例,以便可以使用servlet访问它们。singleton定义servlet将给出什么样的响应 我想知道tomcat是否有一个构造函数,这样我就可以添加代码,这样就可以创建singleton了 *编辑:在搜索了一点之后,我发现我可以尝试使用web服务(JAX-WS)。 不过,我不知道jvm如何处理web服务中的实例。我可以在到WS的不同连接上访问同一对象吗 我使用BMargiles解决方案将这些资源添加到web.xml描述符: <resour

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

我想知道tomcat是否有一个构造函数,这样我就可以添加代码,这样就可以创建singleton了

*编辑:在搜索了一点之后,我发现我可以尝试使用web服务(JAX-WS)。 不过,我不知道jvm如何处理web服务中的实例。我可以在到WS的不同连接上访问同一对象吗

我使用BMargiles解决方案将这些资源添加到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>
创建单例“工厂”:

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();
    }
我现在的问题是知道如何从另一个servlet调用这些方法而不创建新的InitialContext()


编辑:因为新的InitialContext()并不昂贵,所以我用这种方式来做,它对我来说非常好

阅读Tomcat中的JNDI配置。文件是。可以在查找时定义一次要创建的对象

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

或者,您可以使用启动servlet,使用web.xml中定义的
1
初始化单例

好的,我已经创建了一个初始上下文。那么我如何从其他servlet调用我的Singleton呢?新的InitialContext()会消耗大量内存,对吗?不,不会太多。关于如何在server.xml上配置您的singleton以及如何将其从上下文中删除,您必须遵循其余的说明。好的,我正在成功地创建大量上下文并从中获取我的singleton。谢谢你再做一个初始上下文。它们并不昂贵。或者在注释
@WebServlet(urlPatterns=“/my_servlet”,loadOnStartup=1)
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);
        }
    }
    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();
    }