Почему я получаю исключение ConcurrentModificationException только на одном из трех веб-серверов, на которых развернуто такое же точное ухо - PullRequest
0 голосов
/ 04 февраля 2020

У нас есть приложение peopleoft, развернутое на трех идентичных серверах WebLogi c. Балансировка нагрузки устройства netscaler между ними, а также поддержание стабильности сеанса. Поставляемое ушное приложение Peoplesoft поставляется Oracle и не настраивается нами каким-либо образом.

Один из трех веб-серверов демонстрирует исключения ConcurrentModificationException. У нас такое же ухо развернуто на многих других серверах нашего предприятия, но это единственный, который сталкивается с этой проблемой. Проблема настолько серьезна, что нам пришлось держать сервер выключенным и не входить в ферму серверов. Так что теперь мы загружаем баланс между 2 из 3 оригинальных серверов.

Как клиент Oracle, у нас нет доступа к любому из исходного кода . Это затрудняет решение проблемы.

Так как это ухо точно такое же, как уши на правильно функционирующих серверах, я думаю, что «различие» должно быть чем-то вне уха, которое вызывает проблему.

Вот что я понял:

Исключение происходит, когда приложение пытается получить поток из пула соединений JOLT. Этот пул управляется объектом связанного списка java. Поток пытается перебрать связанный список в поисках доступного соединения для подключения к серверу приложений. (Справочная информация: приложение «Peopleoft Ear» (развернутое на сервере приложений WebLogi c) подключается к другому уровню (серверу приложений, состоящему из кода C ++ и java, обменивающегося данными через контролируемые Tuxedo объекты IP C, такие как очереди, разделяемая память ... ) с использованием JOLT. Соединения jolt объединяются для повышения эффективности. Поток завершается ошибкой, прежде чем ему назначается соединение из пула. Другой поток (я полагаю) выполняет итерацию по связанному списку, а затем вызывает исключение ConcurrentModificationException.

Некоторые потоки могут чтобы успешно получить соединение из пула толчков, но при увеличении traffi c возрастает вероятность возникновения исключения ConcurrentModificationException.

Когда я говорю, что что-то проверил, я имею в виду, что сравнивал их с теми же элементами на серверы без проблем

Я проверил многие вещи в поисках причины:

  • проверил и переустановил weblogi c
  • проверил и переустановил peopletools
  • Проверено и переведено d приложениеoplesoft
  • Проверьте и переустановите java
  • использовали другую версию java
  • Проверен путь к классу
  • Проверен переменные среды
  • Проверены лимиты
  • Проверены параметры командной строки 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, может повлиять на это?

Ответы [ 2 ]

0 голосов
/ 06 февраля 2020

Пара вещей:

У меня заканчиваются идеи о том, что проверять.

Как насчет аппаратного обеспечения сервера. Есть ли вероятность, что это сервер с меньшим объемом памяти или меньшим или более медленным процессором, который вызывает различные взаимодействия под нагрузкой?

Если это никогда не происходит на других серверах, то что-то очень неправильно. Есть ли у вас способ скопировать жесткие диски с рабочего сервера на сломанный? Мне кажется, что есть какая-то разница в конфигурации или что-то в этом роде.

Другой поток (я предполагаю) выполняет итерацию по LinkedList и затем вызывает исключение ConcurrentModificationException.

На самом деле вполне нормально, чтобы 2 потока повторяли один и тот же LinkedList. Что не хорошо, так это если список меняется, когда поток перебирает его. На самом деле больше типично для однопоточных приложений, чтобы увидеть CME. Поток может удалить что-то из списка при обстоятельствах, которые могут вызвать итерацию.

В качестве хака, в зависимости от вашего уровня отчаяния, вы можете предоставить другой класс LinkedList для пути к классам и оборудовать его. или даже добавить к нему блокировки, чтобы понять или, возможно, даже защитить от проблемы.

0 голосов
/ 04 февраля 2020

Исключение ConcurrentModificationException почти всегда является ошибкой кодирования. Код не был подготовлен для нескольких запущенных потоков или имеет недостатки. К сожалению, это может произойти случайно, например, когда два потока пытаются изменить ресурс одновременно. Другой сценарий будет состоять в том, чтобы отдельный поток изменял ресурс, который он в данный момент перебирает, используя итератор, работающий при сбое. Второй сценарий может произойти предсказуемо.

Другой поток (я полагаю) выполняет итерацию по связанному списку и затем вызывает исключение ConcurrentModificationException.

Другой поток должен будет изменить связанный список, возможно, добавив или удалив элемент. Это упущение кодирования.

  1. Вы связались с компанией-разработчиком программного обеспечения, которая предоставила вамoplesoft? Они должны исправить свой код и сделать поток psft.pt8.net.JoltSessionPool.getJoltSession(JoltSessionPool.java:276) безопасным.
  2. Другой вариант для этого сервера - запускать его только с одним рабочим потоком. (Настроен для программы Java, чтобы она не открывала несколько потоков Java.) Это может быть временным решением, пока разработчики программного обеспечения не исправят свою ошибку.
  3. Убедитесь, что сервлет weblogi c имеет не был неправильно настроен и позволял несколько потоков, когда это не должно было быть. (Может быть, кодoplesoft не должен претендовать на несколько потоков.)

Почему это происходит на одном конкретном c сервере?

Если он сбалансирован по нагрузке, подумайте, получал ли сервер большую часть нагрузки из-за своего физического расположения по отношению к пользователям веб-службы. Большая активность увеличит вероятность того, что потоки будут конкурировать.

...