我非常清楚Servlet默认是多线程的,即使它正在为多个请求提供服务,它也只会在容器中运行一个实例。但是,此规则的唯一例外是当servlet实现SingleThreadModel
接口时。
我的问题是: 如何找出在给定时间点在Tomcat等容器中运行的servlet的实例数?
答案 0 :(得分:3)
对于Java EE应用程序监视,我总是启动JDK附带的jconsole
工具,并查看Application Server公开的信息。例如,这是您在连接到Tomcat时看到的内容,并在MBeans选项卡上选择Catalina -> Servlet -> Your servlet -> attributes
:
我不确定这是不是你要找的东西,因为我之前没有使用过STM Servlets,但你肯定能找到一些有用的信息。
答案 1 :(得分:2)
以下内容应该有效:
public class MyServlet extends HttpServlet {
private static int activeRequests;
public static int getActiveRequests() {
return activeRequests;
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
activeRequests++;
try {
// do your processing here
} finally {
activeRequests--;
}
}
}
为了获得最佳并发性,您可以将int
替换为AtomicInteger
,但对于++
的简单--
和int
而言,这不是必需的。
答案 2 :(得分:1)
您可以定义一个私有静态int成员变量,并在创建servlet时递增它,在销毁时递减它。