以下のようなEJBがあります-
class ActivityProcessor{
@Resource
private SessionContext context;
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
public boolean processActivity(Activity activity) throws Exception{
try{
//required code for processing activity
}catch(Exception ex){
//Exception while processing activity
handleException(ex,activity);
context.setRollbackOnly();
throw ex;
}
}
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
public void handleException(Exception ex, Activity activity) {
//Code to save this activity in exception table
}
}
処理が失敗した場合にアクティビティを例外 DB テーブルに保存するという要件があります。しかし、上記のコードでは、processActivityに例外がある場合、 handleExceptionメソッドでトランザクション タイムアウト例外が発生します。handleExceptionは個別に正常に動作しています。
EJB トランザクションのこの問題について教えてください。
私の理解では、1. processActivity に対して新しいトランザクションが作成されます。
processActivityで例外が発生した場合、handleExceptionが呼び出されます。トランザクション属性がREQUIRES_NEWであるため、processActivityのトランザクションは中断され、handleExceptionに対して新しいトランザクションが作成されます。
handleException が成功した場合、handleException のトランザクションは保存されます。
processActivity の中断されたトランザクションは再開されますが、context.setRollbackOnly により、ロールバックされます。