案例出于《深入理解Java虚拟机》第二版
场景
一个基于B/S的MIS系统,硬件为2台2个CPU、8G内存的HP系统,服务器是WebLogic9.2。
问题
- 正常运行一段时间后,最近发现在运行期频繁出现集群节点的虚拟机进程自动关闭的现象,留下了一个hs_err_pid###.log文件后,进程消失了。两台物理机器里的每个节点都出现过进程崩溃的现象。
- 从系统日志中可以看出,每个节点的虚拟机进程在奔溃前不久,都发生过大量相同的异常。
java.net.SocketException:Connection reset
分析
异常是远端断开连接的异常,通过系统管理员了解到系统最近与一个OA门户做了集成,在MIS系统工作流的待办事项变化时,要通过Web服务通知OA门户系统,把待办事项的变化同步到OA门户之中。通过SoapUI测试同步待办事项的几个Web服务,发现调用后竟然需长达3分钟才能返回,并且返回结果都是连接中断。
解决方案
- 由于MIS系统的用户多,待办事项变化很快,为了不被OA系统速度拖累,使用了异常的方式调用Web服务,但由于两边服务速度的完成不对等,时间越长就累积了越多Web服务没有调用完成,导致在等待的线程和Socket连接越来越多,最终在超出虚拟机的承受能力后使用虚拟机进程奔溃。
- 解决方法
通知OA门户方修复无法使用的集成接口,并将异步调用改为生成者/消费者模式的消息队列实现后,系统恢复正常。
网友评论