2016-04-21 105 views
0

我目前正在一個項目中,我們有一個方法被調用來生成一個報告,然後將其返回給客戶端。整個過程的工作原理是這樣的:覆蓋由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分鐘,因爲我們只是想讓此特定方法具有擴展超時。謝謝!:)

回答

1

除了設置上的UserTransaction本身的事務超時,還可以增強WebSphere事務超時值在:
服務器>服務器類型> WebSphere應用程序服務器>服務器名稱>
[容器設置]容器服務>事務服務

IBM文檔:Transaction Service Settings

+0

嗨Aguibert。感謝你的快速回復。但是,我們不希望更新2分鐘超時,因爲這是全局設置。我們希望只有這種特定的方法可以調用不同的事務超時。 –

+0

WebSphere Application Server全局事務超時實際上是全局性的,並且會覆蓋任何UserTrans t/o值集。您可以通過增加全局值來實現所需,以允許您最長時間運行的查詢完成並將每個事務的UserTrans t/o設置爲合理的值,但這可能需要大量應用程序更改。如果此功能至關重要,則可以通過https://www.ibm.com/developerworks/rfe/ –

2

您在UserTransaction.setTransactionTimeout()指定的事務超時值應該由最大事務超時被限制,而不是由總交易生存期超時,所以你需要在如果您希望應用程序能夠將事務超時設置爲1200秒,而前者可以保持在較低的值,並且在應用程序未指定事務超時的情況下繼續應用,則前者至少需要1200秒。這些設置的說明在這方面的知識中心的文檔中發現,

https://www.ibm.com/support/knowledgecenter/SSAW57_8.5.5/com.ibm.websphere.nd.doc/ae/udat_contranserv.html?lang=en

還應當指出的是,UserTransaction.setTransactionTimeout()應在開始交易之前被調用,並且僅適用於將在同一線程上運行事務,所以你需要驗證你的應用程序是以這種方式使用它的。

如果您已經完成了上述操作並且產品的行爲不同,我會建議您使用IBM支持打開一個案例。

+0

打開「增強請求」。嗨njr,感謝您的回覆。我知道它會受最大事務超時限制。如果我們的代碼成功覆蓋了事務生命週期超時,它將達到5分鐘的超時時間,並且日誌會顯示「300秒後超時」。我們希望在增加5分鐘之前通過2分鐘。我擔心這可能是因爲我們的代碼錯誤,因爲我們的方法調用流沒有正確調用setTransactionTimeout。我會繼續調查。但我確實想確認這段代碼是否會覆蓋該操作的2分鐘超時時間? –

+0

是的,UserTransaction.setTransactionTimeout()將覆蓋整個交易生命週期超時,因此2分鐘後應該不會看到超時。在代碼示例中,它將有助於包含您在tx.begin()中執行的部分,以確認它是在同一個線程上完成的,並在setTransactionTimeout之後完成。 – njr

+0

嗨njr,謝謝你的跟進。我相信我們開始做的方式();和commit();可能是錯誤的,所以我們正處於試驗和錯誤之中。我們可能沒有像我們添加一些S.O.P那樣在同一個線程中調用它,發現事情很奇怪。我會隨時更新我們的結果。再次感謝你! –