覆盖 WebSphere 设置的事务超时?

Posted

技术标签:

【中文标题】覆盖 WebSphere 设置的事务超时?【英文标题】:Overwriting Transaction Timeout set by WebSphere? 【发布时间】:2016-08-13 23:51:54 【问题描述】:

我目前在一个项目中,我们有一个方法被调用来生成报告,然后将其返回给客户端。整个过程是这样的:

[[应用程序]] --> [[JMS]] --> [[数据库服务器]]

但是,我们的 WebSphere 有一个全局设置,其中 Transaction Timeout 设置为 2 分钟,Maximum Transaction Timeout 设置为 5 分钟。

这给我们带来了一些问题,因为我们的一些报告需要超过 2 分钟,因此,由于 2 分钟后没有来自 DB 服务器的响应,因此 JMS 处的连接被断开。

但是,查询仍在数据库服务器中运行,查询完成大约 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秒后的超时。 [2016 年 4 月 20 日 12:56:06:108 SGT] 00000122 TimeoutManage I WTRN0124I:当发生超时时,与事务关联或最近关联的线程是 Thread[SIBJMSRAThreadPool:1,5,main]。发生超时时该线程的堆栈跟踪为:

我们已经调查并知道我们可以配置另一个 JMS。但是我们如何才能从方法中调用那个特定的 JMS 呢?另外,有没有其他方法可以覆盖 Websphere 中的事务超时?

感谢任何形式的回应。谢谢你。如果您需要任何其他信息,请告诉我。

编辑:我知道能够在 WebSphere 级别更新事务超时,但我们希望将其保留在 2 分钟,因为我们只是希望此特定方法具有延长的超时。谢谢! :)

【问题讨论】:

【参考方案1】:

您在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 支持部门提出案例。

【讨论】:

您好,njr,感谢您的回复。我知道它将受到最大事务超时的限制。如果我们的代码成功地覆盖了 Transaction Lifetime Timeout,它将达到 5 分钟的超时时间,并且日志会显示“已在 300 秒后超时”。我们希望在增加 5 分钟之前通过 2 分钟。恐怕这可能是因为我们的代码错误,我们的方法调用流程没有正确调用我们的 setTransactionTimeout。我会继续调查。但我确实想确认此代码确实覆盖了该操作的 2 分钟超时? 是的,UserTransaction.setTransactionTimeout() 会覆盖 Total Transaction Lifetime Timeout,因此 2 分钟后您应该不会看到超时。在代码示例中,包含执行 tx.begin() 的部分会有所帮助,以确认它是在同一线程上并在 setTransactionTimeout 之后完成的。 您好,njr,感谢您的跟进。我相信我们做 begin(); 的方式。和提交();可能是错误的,所以我们正处于试错之中。我们可能没有在同一个线程上调用它,因为我们添加了几个 S.O.P 并发现事情很奇怪。我会及时通知您我们的结果。再次感谢您!【参考方案2】:

除了在 UserTransaction 本身上设置事务超时之外,您还可以在以下位置增加 WebSphere 的事务超时值:服务器 > 服务器类型 > WebSphere 应用程序服务器 > server_name > [容器设置] 容器服务 > 事务服务

IBM 文档:Transaction Service Settings

【讨论】:

嗨阿吉伯特。感谢你的快速回复。但是,我们不想更新 2 分钟超时,因为这是一个全局设置。我们想让这个特定的方法调用不同的事务超时。 WebSphere Application Server 全局事务超时确实是全局的,并且会覆盖任何 UserTrans t/o 值集。您可以通过增加全局值来实现您想要的,以允许您最长运行的查询完成并将每个事务上的 UserTrans t/o 设置为一个合理的值,但这可能需要大量的应用程序更改。如果此功能很重要,您可以在ibm.com/developerworks/rfe 处提交增强请求

以上是关于覆盖 WebSphere 设置的事务超时?的主要内容,如果未能解决你的问题,请参考以下文章

将会话/事务的超时设置为 DefaultMessageListenerContainer

WebLogic如何设置session超时时间

JBoss事务超时设置?

Ajax:设置超时是不是总是覆盖浏览器的超时?

JBoss事务超时设置?

WebSphere 7 中的消息驱动 bean (EJB3)、XA 事务、错误处理