当由于SQLException(超时)回滚事务时,如何阻止计时器在Weblogic 10.3(EE容器)中重试?

时间:2013-03-28 21:07:26

标签: java timer ejb-3.0 weblogic-10.x jta

基本上我有EJB3计时器调用另一个EJB 3(DAO) - 这个调用包含在catch块中。当尝试获取与DS的连接时,另一个EJB会抛出超时SQL异常(向调用者抛出异常)。在日志中,我看到此超时一直在尝试一次又一次地执行。有什么选择可以阻止它再次尝试?

..
// Timer
@Timeout
public void timeout(Timer timer) { // keeps on coming here 
...
try {

 dao.processJob();
} catch (SQLException) { // catches the timeout
log
}

// dao
@Resource(...)
private Datasource ds

public void process() throws SQLException {
ds.getConnection() // throws timeout here
..
}

1 个答案:

答案 0 :(得分:2)

来自文档:

  

如果bean取消了回滚的事务中的计时器,那么计时器   取消被退回。在这种情况下,计时器   持续时间重置,好像取消从未发生

因此,计时器可能不会被取消。这可能是连续重试的可能原因。

  • 您可以尝试使用process方法捕获异常,而不是抛出异常&可以返回null
  • 或者,对于方法TransactionAttributeType.REQUIRES_NEW,您可以process,这将是新交易的一部分。