Как игнорировать застрявшие темы в Weblogic Server
У меня есть код ниже, работающий на сервере приложений Weblogic 10.3.2. Долгосрочная задача, выполняемая в timerExpired, занимает больше времени, чем общесерверный StuckThreadMaxTime, в 600 секунд. Я не хочу изменять это значение, а просто игнорирую тайм-аут застрявшего потока для этого конкретного потока обработки.
Я вижу, как это можно сделать с помощью обычного WorkManager из этого: http://download.oracle.com/docs/cd/E11035_01/wls100/config_wls/self_tuned.html
Затем добавьте следующее в тег work-manager в файле weblogic.xml:
<ignore-stuck-threads>true</ignore-stuck-threads>
Но как же я могу сделать то же самое для Timer / TimerManager?
web.xml
<resource-ref>
<res-ref-name>tm/TestTimer</res-ref-name>
<res-type>commonj.timers.TimerManager</res-type>
<res-auth>Container</res-auth>
<res-sharing-scope>Unshareable</res-sharing-scope>
</resource-ref>
TestTimer.java:
import commonj.timers.Timer;
import commonj.timers.TimerListener;
import commonj.timers.TimerManager;
public class TestTimer implements TimerListener {
public void init()
TimerManager timerManager =
(TimerManager)initContext.lookup("java:comp/env/tm/TestTimer");
timerManager.schedule(this, SCHEDULE_DELAY);
}
@Override
public void timerExpired(Timer timer) {
// perform long-running task
}
}
2 ответа
Я выбрал простой выход (давление времени), выполнив обработку в работе, запланированной WorkManager, когда истечет время таймера.
public MyClass implements TimerListener, Work
@Override
public void timerExpired(Timer timer) throws Exception {
WorkManager workManager = initContext.lookup("wm/myworkmanager");
workManager.schedule(this);
}
@Override
public void run() {
doWork();
}
}
web.xml
<resource-ref>
<res-ref-name>wm/myworkmanager</res-ref-name>
<res-type>commonj.work.WorkManager</res-type>
<res-auth>Container</res-auth>
<res-sharing-scope>Unshareable</res-sharing-scope>
</resource-ref>
weblogic.xml
<wls:work-manager>
<wls:name>wm/myworkmanager</wls:name>
<wls:ignore-stuck-threads>true</wls:ignore-stuck-threads>
</wls:work-manager>
Я не пробовал это, но добавление этой записи в weblogic.xml должно работать
<work-manager>
<name>timer/TestTimer</name>
<ignore-stuck-threads>true</ignore-stuck-threads>
</work-manager>
name
Матчи res-ref-name
в web.xml
Мой сервер запустился с таймером, хорошо, я не проверял ваш клиент, чтобы увидеть, игнорируются ли сообщения застрявшего потока