我目前正在开发一个公开Web服务接口的Java Web应用程序。我的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对象的相同实例吗?如果没有,这怎么可能?
感谢您的时间。
答案 0 :(得分:3)
简短回答:不,您无法控制应用程序服务器将创建此类的实例数。唯一可靠的是,在第一个请求之前至少会有一个对象被实例化。 通常,应用程序服务器为每个工作线程创建一个实例,这意味着相同类的数十个对象。
但是,在这些实例之间可以有公共数据,最简单的解决方案是使用static
成员变量。保证静态成员在每个对象中都是唯一的,因为它们属于该类。
@WebService()
public class ETL_WS {
// ...
private static ConcurrentHashMap myMap;
// ...
}
答案 1 :(得分:1)
我能想到的一种方法是将它保存在Webservice后面的单例中,这样WS生命周期并不重要(它是单例 - 但WS接口的目的是简单地获取请求在,最好将应用程序的核心逻辑封装在服务中。)