0

基本的に、別の EJB 3 (DAO) を呼び出す EJB3 タイマーがあります。この呼び出しは 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 methodを持つこともできます。process
于 2013-03-29T10:07:55.313 に答える