【发布时间】:2020-05-20 10:01:23
【问题描述】:
我们在三个相同的 WebLogic 服务器上部署了 peoplesoft 应用程序。 netscaler 设备在它们之间进行负载平衡并保持会话粘性。交付的 Peoplesoft ear 应用程序由 Oracle 交付,我们没有以任何方式定制。
三个 Web 服务器之一出现 ConcurrentModificationExceptions。我们在整个企业的许多其他服务器上部署了相同的耳朵,但这是唯一遇到此问题的服务器。这个问题非常严重,以至于我们不得不让服务器停机并离开服务器场。所以现在我们在原来的 3 台服务器中的 2 台上进行负载平衡。
作为 Oracle 的客户,我们无权访问任何源代码。这使得缩小问题的范围变得困难。
由于这只耳朵与正常运行的服务器上的耳朵完全相同,我认为“差异”一定是导致问题的耳朵之外的东西。
这是我的发现:
当应用程序试图从 JOLT 连接池中获取线程时发生异常。该池由 java 链表对象管理。线程尝试遍历链表以寻找可用的连接来连接到应用服务器。 (背景:peoplesoft ear(部署在 WebLogic App Server 中)使用 JOLT 连接到另一层(由 C++ 和 java 代码组成的 App Server,通过 Tuxedo 控制的 IPC 对象(如队列、共享内存......)进行通信)。颠簸连接是池化以提高效率。线程在从池中分配连接之前失败。另一个线程(我假设)遍历链表,然后导致 ConcurrentModificationException。
一些线程能够成功地从 jolt 池中获得连接,但是当流量增加时,发生 ConcurrentModificationException 的可能性也会增加。
当我说我检查了某些东西时,我的意思是我将它们与服务器上的相同项目进行了比较而没有问题
我检查了很多东西以寻找原因:
- 检查并重新安装 weblogic
- 检查并重新安装 peopletools
- 检查并重新部署 peoplesoft 应用程序
- 检查并重新安装 java
- 使用了不同版本的 java
- 检查了类路径
- 检查环境变量
- 检查了 ulimits
- 检查了 java 命令行选项
- 检查了操作系统版本、技术级别和服务包版本
- 检查了操作系统文件集
我对要检查的内容没有任何想法。
java.util.ConcurrentModificationException java.util.ConcurrentModificationException<br>^M
at java.util.LinkedList$ListItr.checkForComodification(LinkedList.java:977)^M
at java.util.LinkedList$ListItr.next(LinkedList.java:899)^M
at psft.pt8.net.JoltSessionPool.getJoltSession(JoltSessionPool.java:276)^M
at psft.pt8.net.NetSession.getJoltSession(NetSession.java:693)^M
at psft.pt8.net.NetReqRepSvc.sendRequest(NetReqRepSvc.java:556)^M
at psft.pt8.net.NetService.requestService(NetService.java:167)^M
at psft.pt8.net.NetReqRepSvc.requestService(NetReqRepSvc.java:354)^M
at psft.pt8.jb.JBEntry.processRequest(JBEntry.java:673)^M
at psft.pt8.psc.onActionGen(psc.java:3045)^M
at psft.pt8.psc.onAction(psc.java:1753)^M
at psft.pt8.psc.onAction(psc.java:1742)^M
at psft.pt8.psc.service(psc.java:963)^M
at javax.servlet.http.HttpServlet.service(HttpServlet.java:790)^M
at weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:286)^M
at weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:260)^M
at weblogic.servlet.internal.StubSecurityHelper.invokeServlet(StubSecurityHelper.java:137)^M
at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:350)^M
at weblogic.servlet.internal.TailFilter.doFilter(TailFilter.java:25)^M
at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:78)^M
at weblogic.websocket.tyrus.TyrusServletFilter.doFilter(TyrusServletFilter.java:274)^M
at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:78)^M
at psft.pt8.psfilter.doFilter(psfilter.java:88)^M
at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:78)^M
at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.wrapRun(WebAppServletContext.java:3706)^M
at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.run(WebAppServletContext.java:3672)^M
at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:328)^M
at weblogic.security.service.SecurityManager.runAsForUserCode(SecurityManager.java:197)^M
at weblogic.servlet.provider.WlsSecurityProvider.runAsForUserCode(WlsSecurityProvider.java:203)^M
at weblogic.servlet.provider.WlsSubjectHandle.run(WlsSubjectHandle.java:71)^M
at weblogic.servlet.internal.WebAppServletContext.doSecuredExecute(WebAppServletContext.java:2443)^M
at weblogic.servlet.internal.WebAppServletContext.securedExecute(WebAppServletContext.java:2291)^M
at weblogic.servlet.internal.WebAppServletContext.execute(WebAppServletContext.java:2269)^M
at weblogic.servlet.internal.ServletRequestImpl.runInternal(ServletRequestImpl.java:1705)^M
at weblogic.servlet.internal.ServletRequestImpl.run(ServletRequestImpl.java:1665)^M
at weblogic.servlet.provider.ContainerSupportProviderImpl$WlsRequestExecutor.run(ContainerSupportProviderImpl.java:272)^M
at weblogic.invocation.ComponentInvocationContextManager._runAs(ComponentInvocationContextManager.java:352)^M
at weblogic.invocation.ComponentInvocationContextManager.runAs(ComponentInvocationContextManager.java:337)^M
at weblogic.work.LivePartitionUtility.doRunWorkUnderContext(LivePartitionUtility.java:57)^M
at weblogic.work.PartitionUtility.runWorkUnderContext(PartitionUtility.java:41)^M
什么,在 java 耳朵之外会影响这个?
【问题讨论】:
-
所有服务器是否运行完全相同的 Java 版本?
-
是的,丹,所有三台服务器都运行完全相同的 java 版本。我做了很多事情来验证它们是否完全相同(除了 java -version)。我编写了一个脚本来爬取整个 java 部署并生成 in 下每个文件的消息哈希 (sha-1),然后在工作服务器上执行相同操作。然后我使用各种比较工具来寻找任何差异,但没有
标签: java multithreading linked-list iterator concurrentmodification