我目前在一个项目中,我们有一个方法可以被调用来生成报告,然后将其返回给客户端。整个过程是这样的:
[[应用程序]] --> [[JMS]] --> [[数据库服务器]]
但是,我们的 WebSphere 有一个全局设置,其中事务超时设置为 2 分钟,最大事务超时设置为 5 分钟。
这给我们带来了一些问题,因为我们的一些报告花费的时间超过 2 分钟,因此,由于 2 分钟后数据库服务器没有响应,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分钟后遇到的错误:
[4/20/16 12:56:06:105 SGT] 00000122 TimeoutManage I WTRN0006W: Transaction Curam#coreinf-ejb.jar#DPEnactmentMDB 000001543204A61800000001478C576857C2F09B4365FB74A6A3A28FED806D44107D7CBC000001543204A61800000001478C576857C2F09B4365FB74A6A3A28FED806D44107D7CBC00000001 has timed out after 120 seconds. [4/20/16 12:56:06:108 SGT] 00000122 TimeoutManage I WTRN0124I: When the timeout occurred the thread with which the transaction is, or was most recently, associated was Thread[SIBJMSRAThreadPool : 1,5,main]. The stack trace of this thread when the timeout occurred was:
我们已经调查并知道我们可以配置另一个 JMS。但是我们如何才能从方法中调用特定的 JMS?另外,还有其他方法可以覆盖Websphere中的事务超时吗?
感谢任何类型的回应。谢谢。如果您需要任何其他信息,请告诉我。
编辑:我知道能够在 WebSphere 级别更新事务超时,但我们希望将其保留在 2 分钟,因为我们只是希望此特定方法具有延长的超时。谢谢! :)
最佳答案
除了在 UserTransaction 本身上设置事务超时之外,您还可以在以下位置增加 WebSphere 的事务超时值:
服务器 > 服务器类型 > WebSphere 应用程序服务器 > server_name >
[容器设置]容器服务>事务服务
IBM 文档:Transaction Service Settings
关于transactions - 覆盖 WebSphere 设置的事务超时?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36758413/