【发布时间】: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 分钟,因为我们只是希望此特定方法具有延长的超时。谢谢! :)
【问题讨论】:
标签: transactions timeout jms websphere