2013-03-28 27 views
0

基本上我有EJB3計時器調用另一個EJB 3(DAO) - 這個調用被包裝在catch塊中。當嘗試獲取到DS的連接時,另一個EJB會引發超時SQL異常(向調用方拋出異常)。在日誌中我發現這個超時是一直試圖執行的。有什麼選擇來防止它再次嘗試?如何在由於SQLException(超時)而導致事務回滾時在Weblogic 10.3(EE容器)中重試計時器?

.. 
// 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 
.. 
} 

回答

2

從技術文檔:

如果一個bean會取消被回滾時,計時器 取消回滾事務中的計時器。在這種情況下,定時器的 持續時間被重置,就好像取消從未發生過一樣。

因此,計時器可能不會被取消。這可能是不斷重試的可能原因。

  • 你可以嘗試趕上process方法例外,而不是把它扔&可以返回null
  • 或者,您可以使用方法processTransactionAttributeType.REQUIRES_NEW,這將成爲新事務的一部分。
+0

TransactionAttributeType.REQUIRES_NEW是我正在尋找。謝謝。 –

+0

@Spenser不客氣,很高興幫助。 –

相關問題