org.apache.activemq.ra.ServerSessionPoolImpl.closeSessions()关闭方法存在问题

Latest response

在jboss7下使用jboss-cli的执行 :shutdown(timeout=60)停止jboss7服务时,在有mdb消息处理压力的情况下,经常会出现无法正常停止的情况

经过查看serverlog发现,jboss-cli的shutdown过程会首先进行Suspending server操作,
在该过程中,对于ic业务的应用,会去关闭ActiveMQ的session连接,把amq的日志调整为trace级别,根据日志,代码分析及跟踪调试发现,
在执行中会调用org.apache.activemq.ra.ActiveMQEndpointWorker.stop()方法,该方法会调用org.apache.activemq.ra.ServerSessionPoolImpl.close()方法
该close方法中会调用closeSessions()的方法,该方法在关闭amq的session连接后会返回activeSessions这个list的长度,但是最后不知道什么原因,
activeSessions这个list中始终有一个或几个ServerSession清不掉,导致close方法陷入死循环,整个suspending进程就处于等待状态,无法执行后续的shutdown工作,关闭失败
org.apache.activemq.ra.ServerSessionPoolImpl.close()

closeSessions()
查看amq-ra中的代码,activeSessions的调用关系,只有org.apache.activemq.ra.ServerSessionImpl.run()方法中会有从activeSessions中remove ServerSession的操作
该run方法最后应该是由ServerSessionImpl.start()中一个worker启动的独立线程,
向activeSessions中add ServerSession的操作只有org.apache.activemq.ra.ServerSessionPoolImpl.getServerSession()方法,该方法最后会执行serverSession.start();
从已下载的代码和serverlog中打出来的前后的日志并没有发现是哪个add之后没有移除,导致死循环的发生
可能存在的问题:org.apache.activemq.ra.ServerSessionPoolImpl.closeSessions()中既然是主动关闭session连接,就该在每关闭一个后移除一个,而不是要依赖其他的线程来帮助清理list
至少从ic业务关闭jboss7出现的问题看,直接移除不会卡在这个地方。

Responses