Статьи

Работа с застрявшими потоками в WebLogic


WebLogic Server диагностирует
поток как застрявший, если он
непрерывно работает (не работает) в течение заданного периода времени.

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

Проблема или Почему Застрявшие Нити злые?


WebLogic Server автоматически определяет, когда поток в очереди выполнения «застревает».
Поскольку застрявший поток не может завершить свою текущую работу или принять новую работу, сервер регистрирует сообщение каждый раз, когда диагностирует застрявший поток.
Если все потоки в очереди выполнения зависают, сервер меняет свое состояние работоспособности на «предупреждение» или «критическое состояние» в зависимости от очереди выполнения:

  • Если все потоки в очереди по умолчанию застряли, сервер изменит свое состояние работоспособности на « критическое ». (Вы можете настроить приложение Node Manager на автоматическое отключение и перезапуск серверов в критическом состоянии. Дополнительную информацию см. В разделе « Возможности Node Manager » в разделе « Настройка и управление сервером WebLogic».)
  • Если все потоки в weblogic.admin.HTTP, weblogic.admin.RMI или пользовательской очереди выполнения застряли, сервер изменит свое состояние работоспособности на « предупреждение ».

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

Что вы можете сделать, чтобы избежать полного сбоя приложения?

WebLogic Server периодически проверяет наличие застрявших потоков (это интервал таймера застрявших потоков,
и вы можете настроить его
здесь). Если все потоки приложения зависли, экземпляр сервера помечает себя как сбойный, если настроен для этого, завершается. Вы можете настроить Node Manager или стороннее решение высокой доступности для перезапуска экземпляра сервера для автоматического восстановления после сбоя. Вы можете настроить эти действия так, чтобы они выполнялись, когда не все потоки зависли, но число застрявших потоков превысило настроенный порог: Завершите работу диспетчера работ, если он застрял. Закрытый Диспетчер работ откажется от новой работы и отклонит существующую работу в очереди, отправив сообщение об отказе. В кластере кластерные клиенты будут переключаться на другой элемент кластера.

  • Закройте приложение, если в приложении есть застрявшие темы. Приложение закрывается, переводя его в режим администратора. Все работающие менеджеры, принадлежащие приложению, закрываются и ведут себя, как описано выше.
  • Отметьте экземпляр сервера как сбойный и закройте его, если на сервере застряли потоки. В кластере кластерные клиенты, которые подключены или пытаются подключиться, переключатся на другой элемент кластера.

Как определить проблему?

Наиболее рекомендуемый способ — проверить дампы потоков. Установите
флажок Отправка оповещения по электронной почте о застрявших потоках с  сообщением « Потоки дампов» в 
Middleware magic , чтобы сообщения о дампах по почте отправлялись вам автоматически по мере их возникновения.

Инструменты, которые помогут вам с анализом дампов потоков:

Как обойти проблему?

После того, как вы определили код, который вызывает застрявший поток, то есть код, выполнение которого занимает больше, чем максимальное время потока стека, вы можете использовать Work Manager для выполнения вашего кода. Менеджеры работ имеют опции Ignore Stuck Thread, которые дают возможность выполнять долго выполняющиеся задания. См. ниже:

Ниже приведены некоторые сообщения о том, как создать Work Manager.

Тест: Как создать Застрявшую Нить?


Как создать Застрявшую Нить, чтобы проверить ваши настройки в Интернете?
Поместите точку останова в базовый метод или метод модели, который вызывается по вашему запросу. Если вы подождете в точке останова Stuck Max Thread Time, вы заметите, что трассировка Stuck Thread будет отображаться в журнале серверов:

<16 =Ύί 2011 12:28:22 ΉΉ EET> <Error> <WebLogicServer> <BEA-000337> <[STUCK] ExecuteThread: '2' for queue: 
    'weblogic.kernel.Default (self-tuning)' has been busy for "134" seconds working on the 
request "weblogic.servlet.internal.ServletRequestImpl@6e6f4718[
GET /---/---/----/---/days.xhtml HTTP/1.1
Connection: keep-alive
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.2 (KHTML, like Gecko) Chrome/15.0.874.120 Safari/535.2
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-GB,en-US;q=0.8,en;q=0.6
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3
Cookie: JSESSIONID=DYG5TDTZSnKLTFw5CMMdLCD9sPsZS4Jqlmxj9wdGNyt1BnPcfNrR!-1520792836


]", which is more than the configured time (StuckThreadMaxTime) of "60" seconds. Stack trace:
        --------------------------------------------(--------------------.java:83)
        javax.faces.component.UIComponentBase.encodeBegin(UIComponentBase.java:823)
        com.sun.faces.renderkit.html_basic.HtmlBasicRenderer.encodeRecursive(HtmlBasicRenderer.java:285)
        com.sun.faces.renderkit.html_basic.GridRenderer.renderRow(GridRenderer.java:185)
        com.sun.faces.renderkit.html_basic.GridRenderer.encodeChildren(GridRenderer.java:129)
        javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:848)
        org.primefaces.renderkit.CoreRenderer.renderChild(CoreRenderer.java:55)
        org.primefaces.renderkit.CoreRenderer.renderChildren(CoreRenderer.java:43)
        org.primefaces.component.fieldset.FieldsetRenderer.encodeContent(FieldsetRenderer.java:95)
        org.primefaces.component.fieldset.FieldsetRenderer.encodeMarkup(FieldsetRenderer.java:76)
        org.primefaces.component.fieldset.FieldsetRenderer.encodeEnd(FieldsetRenderer.java:53)
        javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:878)
        javax.faces.component.UIComponent.encodeAll(UIComponent.java:1620)
        javax.faces.render.Renderer.encodeChildren(Renderer.java:168)
        javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:848)
        org.primefaces.renderkit.CoreRenderer.renderChild(CoreRenderer.java:55)
        org.primefaces.renderkit.CoreRenderer.renderChildren(CoreRenderer.java:43)
        org.primefaces.component.panel.PanelRenderer.encodeContent(PanelRenderer.java:229)
        org.primefaces.component.panel.PanelRenderer.encodeMarkup(PanelRenderer.java:152) 


Больше копать:

ЦСИ: