Служба таймера EJB: WTRN0006W: Тайм-аут транзакции xxxx истек через 120 секунд - PullRequest
0 голосов
/ 01 мая 2019

У нас есть 4 задания таймера, которые выполняются ежедневно в разное время.Для этого мы используем встроенный планировщик постоянного таймера по умолчанию с четырьмя потоками.В этом пакетном задании мы извлекаем содержимое многих таблиц DB2 и затем сохраняем данные каждой таблицы в файле либо на удаленном сервере, либо в IBM Cloud Object Store.Мы замечаем, что если любой внешний ресурс (например, DB2 или SFTP для удаленного сервера или IBM COS) отвечает до 120 секунд, мы получаем следующее исключение:

    WTRN0124I: When the timeout occurred the thread with which the transaction is, or was most recently, associated was 
    Thread[WebSphere_EJB_Timer_Service_WorkManager.Alarm Pool : 0,5,WebSphere_EJB_Timer_Service_WorkManager: WAS Scheduler: 
    WebSphere_EJB_Timer_Service]. The stack trace of this thread when the timeout occurred was: 
    java.net.SocketInputStream.socketRead0(Native Method)
    java.net.SocketInputStream.socketRead(SocketInputStream.java:127)
    java.net.SocketInputStream.read(SocketInputStream.java:182)
    java.net.SocketInputStream.read(SocketInputStream.java:152)

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

1 Ответ

1 голос
/ 01 мая 2019

Существует несколько различных подходов для достижения желаемого поведения:

1) Увеличьте время ожидания транзакции для компонента, чтобы метод таймера завершился успешно.Это делается в файле дескриптора развертывания ibm-ejb-jar-ext.xml и будет выглядеть примерно так, чтобы увеличить время ожидания транзакции до 600 секунд:

<?xml version="1.0" encoding="UTF-8"?>
<ejb-jar-ext xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://websphere.ibm.com/xml/ns/javaee"
    xsi:schemaLocation="http://websphere.ibm.com/xml/ns/javaee http://websphere.ibm.com/xml/ns/javaee/ibm-ejb-jar-ext_1_0.xsd" version="1.0">
  <session name="<your timer bean name>">
    <global-transaction transaction-time-out="600"/>
  </session>
</ejb-jar-ext>

Примечание. Вам также потребуется увеличить максимальное время ожидания транзакции для сервера.а также: https://www.ibm.com/support/knowledgecenter/en/SSNGTE_7.1.0/com.ibm.tspm.doc_7.1/install/task/ConfigureTransactionLifetimeTimeout.html

2) Измените метод тайм-аута компонента, чтобы не использовать транзакцию:

@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)

3) Измените компонент для использования транзакций, управляемых компонентом, тогда либо не используйтеиспользуйте транзакцию или установите тайм-аут транзакции в UserTransaction:

@TransactionManagement(TransactionManagementType.BEAN)
userTransaction.setTransactionTimeout(600);
userTransaction.begin();

4) Настройте EJB TimerService, чтобы не повторять попытку.Метод таймера может все еще иметь тайм-аут и, таким образом, технически потерпеть неудачу, но контейнер не будет повторен.К сожалению, это возможно только для непостоянных таймеров, установив Maximum number of retries, как описано здесь: https://www.ibm.com/support/knowledgecenter/en/SSAW57_8.5.5/com.ibm.websphere.nd.multiplatform.doc/ae/uejb_timerservice.html

...