我目前正在一個項目中,我們有一個方法被調用來生成一個報告,然後將其返回給客戶端。整個過程的工作原理是這樣的:覆蓋由WebSphere設置的事務超時?
[應用] - > [JMS] - > [DB服務器]
然而,我們的WebSphere有一個全球性的環境,讓事務超時是設置爲2分鐘,並且最大事務超時設置爲5分鐘。
這已經給我們帶來一些問題,因爲我們的一些報告花費的時間超過了2分鐘,因此連接在JMS上被丟棄,因爲2分鐘後DB Server沒有響應。
但是,查詢仍在數據庫服務器中運行,查詢完成後大約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分鐘後遇到的錯誤:
[16年4月20日12:56:06:105 SGT] 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中的Transaction Timeout?
欣賞任何形式的迴應。謝謝。如果您需要任何其他信息,請告訴我。
編輯:我知道能夠更新WebSphere級別的事務超時,但我們希望將它保留在2分鐘,因爲我們只是想讓此特定方法具有擴展超時。謝謝!:)
嗨Aguibert。感謝你的快速回復。但是,我們不希望更新2分鐘超時,因爲這是全局設置。我們希望只有這種特定的方法可以調用不同的事務超時。 –
WebSphere Application Server全局事務超時實際上是全局性的,並且會覆蓋任何UserTrans t/o值集。您可以通過增加全局值來實現所需,以允許您最長時間運行的查詢完成並將每個事務的UserTrans t/o設置爲合理的值,但這可能需要大量應用程序更改。如果此功能至關重要,則可以通過https://www.ibm.com/developerworks/rfe/ –