Java 与HttpSessionListener的会话数少于零
我想在我的web应用程序中添加一些逻辑来检查应用程序中活动会话的数量 作为记录,我正在使用Tomcat7上提供的Spring4应用程序 这就是我实现的:Java 与HttpSessionListener的会话数少于零,java,spring,session,tomcat,Java,Spring,Session,Tomcat,我想在我的web应用程序中添加一些逻辑来检查应用程序中活动会话的数量 作为记录,我正在使用Tomcat7上提供的Spring4应用程序 这就是我实现的: public class SessionCounter implements HttpSessionListener { private static final Logger logger = LoggerFactory.getLogger(SessionCounter.class); private static fin
public class SessionCounter implements HttpSessionListener {
private static final Logger logger = LoggerFactory.getLogger(SessionCounter.class);
private static final AtomicInteger ACTIVE_SESSIONS = new AtomicInteger();
@Override
public void sessionCreated(HttpSessionEvent event) {
logger.debug("session count is now: " + ACTIVE_SESSIONS.incrementAndGet());
}
@Override
public void sessionDestroyed(HttpSessionEvent event) {
int sessions = ACTIVE_SESSIONS.decrementAndGet();
logger.debug("session count is now: " + sessions);
if (sessions < 0) {
logger.error("number of active sessions is less than zero ({})", sessions);
}
}
}
我把sessions<0部分放在云雀上,认为它永远不会达到那个点,但唉,它做到了
我知道多线程和静态非常量变量是一种特殊的技巧,但我没有看到任何明显的错误
在这段代码中,活动会话怎么可能小于零?如何注册HttpSessionListener?为什么在sessionCreated debug消息中进行任何计算,这是非常糟糕的做法?虽然,我不确定这是问题所在。但基本上在将来,编译器可能会对此进行优化,并将您的sting组合视为lambda表达式,它将被传输到记录器,并且将仅在调试模式下进行计算。web中的test.setup.SessionCounter。xml@mavarazy我明白你的意思,实际上我在sessionDestroyed方法中避免了这一点。当然也会改变这一点,不过我怀疑这是问题的原因。请看一看,假设存在异步多线程通知的可能性,可能是在创建之前调用了destroct。例如,对于短请求,可能会发生这种情况