Transactions 覆盖WebSphere设置的事务超时?

Transactions 覆盖WebSphere设置的事务超时?,transactions,timeout,jms,websphere,Transactions,Timeout,Jms,Websphere,我目前在一个项目中,我们有一个方法,它被调用来生成一个报告,然后返回给客户端。整个过程如下所示: [[Application]]-->[[JMS]]-->[[DB Server]] 然而,我们的WebSphere有一个全局设置,其中事务超时设置为2分钟,最大事务超时设置为5分钟 这给我们带来了一些问题,因为我们的一些报告花费的时间超过2分钟,因此,JMS上的连接被中断,因为2分钟后DB服务器没有响应 但是,查询仍在数据库服务器中运行,在查询完成大约20分钟后,它尝试返回结果,但无法返回,因为连接

我目前在一个项目中,我们有一个方法,它被调用来生成一个报告,然后返回给客户端。整个过程如下所示:

[[Application]]-->[[JMS]]-->[[DB Server]]

然而,我们的WebSphere有一个全局设置,其中事务超时设置为2分钟,最大事务超时设置为5分钟

这给我们带来了一些问题,因为我们的一些报告花费的时间超过2分钟,因此,JMS上的连接被中断,因为2分钟后DB服务器没有响应

但是,查询仍在数据库服务器中运行,在查询完成大约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 SGT]00000122超时管理I WTRN0006W:事务处理库#coreinf ejb.jar#dpactuationMDB 000001543204A6180000001478C576857C2F09B4365FB74A6A3A28FED806D44107D7CBC00001543204A6180000001478C576857C2F09B4365FB74A6A28FED806D44107D7CBC00000001在120秒后超时。 [4/20/16 12:56:06:108 SGT]00000122 TimeoutManage I WTRN0124I:超时发生时,与事务关联或最近关联的线程是线程[SIBJMSRAThreadPool:1,5,main]。发生超时时此线程的堆栈跟踪为:

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

感谢任何回应。非常感谢。如果您需要任何其他信息,请告诉我


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

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


IBM文档:

您在
UserTransaction.setTransactionTimeout()
上指定的事务超时值应受到最大事务超时的约束,但不受总事务生存期超时的约束,因此,如果希望应用程序能够将事务超时设置为1200秒,则需要将前者增加到至少1200秒,而后者可以保持较小的值,并在应用程序未指定事务超时的情况下继续应用。这些设置的说明可在此知识中心文档中找到

还应注意,在开始事务之前应调用
UserTransaction.setTransactionTimeout()
,并且仅适用于将在同一线程上运行的事务,因此您需要验证应用程序是否以这种方式使用它


如果您已经完成了上述操作,并且产品的表现有所不同,我建议您与IBM支持人员一起打开一个案例。

Hi Aguibert。谢谢你的快速回复。但是,我们不想更新2分钟超时,因为这是一个全局设置。我们只想让这个特定的方法调用一个不同的事务超时。WebSphereApplicationServer全局事务超时实际上是全局的,并覆盖任何UserTrans t/o值集。您可以通过增加全局值来完成最长运行时间的查询,并将每个事务上的UserTrans t/o设置为合理的值,从而实现所需的功能,但这可能需要对应用程序进行大量更改。如果此功能非常重要,您可以在Hi njr打开增强请求,感谢您的回复。我知道它将受到最大事务超时的限制。如果我们的代码成功覆盖事务生存期超时,它将达到5分钟超时,日志将显示“300秒后超时”。我们希望在增加5分钟超时之前通过2分钟超时。我担心这可能是因为我们的代码错误,方法调用的流没有正确调用setTransactionTimeout。我会继续调查。但是我确实想确认此代码是否覆盖了操作的2分钟超时?是的,UserTransaction.setTransactionTimeout()覆盖了整个事务生存期超时,因此您不应该在2分钟后看到超时。在代码示例中,包含执行tx.begin()的部分会有所帮助,以确认在同一线程上以及setTransactionTimeout之后执行了tx.begin()。我相信我们开始的方式;和提交();可能是错误的,所以我们正处于试错之中。我们可能没有在同一个线程上调用它,因为我们添加了几个S.O.P,发现事情非常奇怪。我会让你了解我们的最新结果。再次感谢你!