2

我目前正在开发一个公开 Web 服务接口的 Java Web 应用程序。我的网络服务的类定义如下:

@WebService()
public class ETL_WS {
    private String TOMCAT_TEMP_DIR;
    private final int BUFFER_SIZE = 10000000;
    private ConcurrentHashMap myMap;
    private String dbTable = "user_preferences";

    public ETL_WS() {
        Context context = null;
        try {
            context = (Context) new InitialContext().lookup("java:comp/env");
            this.TOMCAT_TEMP_DIR = (String) context.lookup("FILE_UPLOAD_TEMP_DIR");
        }catch(NamingException e) {
        System.err.println(e.getMessage());
    }

    public long getCouponMapCreationTime() {
        return couponMap.getCreationTime();
    }

}

由于我需要所有请求来查看相同的 ConcurrentHashMap myMap 实例,我想知道 Web 服务对象的生命周期是多少。具体来说,我知道它是在第一个客户端请求时初始化的。但是,所有客户端都会看到myMap 对象的同一个实例吗?如果不是,这怎么可能?

感谢您的时间。

4

2 回答 2

3

简短的回答:不,您无法控制应用程序服务器将创建多少个此类的实例。唯一可以确定的是,在第一个请求之前至少会实例化一个对象。通常,应用服务器为每个工作线程创建一个实例,这意味着同一类的数十个对象。

但是,这些实例之间可能有共同的数据,最简单的解决方案是使用static成员变量。静态成员保证在每个对象中都是唯一的,因为它们属于类。

@WebService()
public class ETL_WS {
    // ...
    private static ConcurrentHashMap myMap;
    // ...
}
于 2012-06-19T12:58:05.193 回答
1

我能想到的一种方法是在 Webservice 后面的单例中维护它,这样 WS 生命周期并不重要(它是一个单例 - 但 WS 接口的目的是简单地获取请求,它将其背后的应用程序的核心逻辑封装在一个服务中会更好)。

于 2012-06-19T12:55:22.707 回答