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

Hi ! :)

Can you please translate your post into English language ? As it stands right now, chances are that you won't get many responses.

Regards,
Christian

Close

Welcome! Check out the Getting Started with Red Hat page for quick tours and guides for common tasks.