Я сейчас в проекте, где у нас есть метод, который вызывается для создания отчета, а затем возвращает его на клиентскую сторону. Весь процесс что-то вроде это работает:Тайм-аут перезаписи с использованием WebSphere?
[[Application]] -> [[JMS]] -> [[DB сервер]]
Однако наш WebSphere имеет глобальный параметр, где транзакция Тайм-аут, установлен на 2 минуты, а максимальное время транзакции - 5 минут.
Это вызвало у нас некоторые проблемы, потому что некоторые из наших отчетов занимают больше 2 минут, и, таким образом, соединение отбрасывается в JMS, потому что от сервера БД нет ответа через 2 минуты.
Однако запрос все еще запущен на сервере БД, и примерно через 20 минут, когда запрос завершен, он пытается вернуть результат, но не может, поскольку соединение уже отключено.
Ниже метод, который мы называем
public void generateReport(long ticketID, long inst_data_id, boolean flag)
throws AppException, InformationalException {
Trace.kToolsLogger.info("*********** Report generation started ******");
if(Configuration.runningInAppServer()){
try {
Trace.kToolsLogger.info("*********** Transaction timeout set to 1200 ******");
InitialContext ctx = new InitialContext();
UserTransaction tx = (UserTransaction)ctx.lookup("java:comp/UserTransaction");
tx.setTransactionTimeout(1200);
} catch (SystemException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
} else{
Trace.kToolsLogger.info("Not running in app server. Timeout not set to 120");
}
Однако выше установка все еще не работает, и мой метод еще таймаут на 2 минуты.
Это ошибка, что я всегда сталкиваются через 2 минуты:
[4/20/16 12: 56: 06: 105 СГТ] 00000122 TimeoutManage Я WTRN0006W: Сделка Curam # coreinf-EJB. jar # DPEnactmentMDB 000001543204A61800000001478C576857C2F09B4365FB74A6A3A28FED806D44107D7CBC000001543204A61800000001478C576857C2F09B4365FB74A6A3A28FED806D44107D7CBC00000001 истекает через 120 секунд. [4/20/16 12: 56: 06: 108 SGT] 00000122 TimeoutManage I WTRN0124I: Когда произошел тайм-аут, поток, с которым связана транзакция или недавно был связан, был Thread [SIBJMSRAThreadPool: 1,5, main] , Трассировка стека этой нити при возникновении таймаута:
Мы исследовали и знаем, что мы можем настроить другую JMS. Но как мы сможем вызвать эту конкретную JMS из метода? Кроме того, есть ли другой способ перезаписать тайм-аут транзакции в Websphere?
Цените любой ответ. Спасибо. Пожалуйста, дайте мне знать, если вам нужна какая-либо другая информация.
EDIT: Я знаю, что могу обновить Тайм-аут транзакции на уровне WebSphere, но мы надеемся оставить его на 2 минуты, поскольку мы просто хотим, чтобы этот конкретный метод имел расширенный тайм-аут. Благодаря!:)
Hi Aguibert. Спасибо за быстрый ответ. Однако мы не хотим обновлять тайм-аут 2 минуты, так как это глобальные настройки. Мы хотели бы, чтобы этот конкретный метод вызывал другой тайм-аут транзакции. –
Глобальный тайм-аут глобальной сети WebSphere Application Server действительно глобальный и отменяет любое значение t/o UserTrans. Вы можете достичь того, чего хотите, увеличив глобальное значение, чтобы завершить ваш самый длинный запрос и установить значение UserTrans t/o для каждой транзакции на разумную величину, но для этого может потребоваться множество изменений приложения. Если эта возможность имеет решающее значение, вы можете открыть запрос на повышение по адресу https://www.ibm.com/developerworks/rfe/ –