0

基本上我有 EJB3 计时器调用另一个 EJB 3 (DAO) - 这个调用被包裹在 catch 块中。另一个 EJB 在尝试获取与 DS 的连接时抛出超时 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
..
}
4

1 回答 1

2

从文档:

如果 bean 在回滚的事务中取消计时器,则计时器取消将回滚。在这种情况下,计时器的持续时间会被重置,就好像取消从未发生过一样

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

  • 您可以尝试在process方法中捕获异常,而不是抛出它 & 可以返回null
  • 或者,您可以拥有TransactionAttributeType.REQUIRES_NEWfor 方法process,这将成为新交易的一部分。
于 2013-03-29T10:07:55.313 回答