2012-03-21 22 views
2

これは私の問題です。 2つのEJB/JPA/Hibernateモジュールを使用して同期バッチを処理します。EJB/JPAバッチプロセス例外管理

最初のモジュールは、データベースAの情報を読み取り、変更を検出します。 変更が検出されると、変更された項目はJMSを介して2番目のモジュールに送信されます。

第二のモジュールは、更新処理が完了すると、正常に更新されたアイテムのIDを含むメッセージが最初に送信され、データベースBに変更された項目と更新情報を通じて

をメッセージと反復処理を読み出しデータベースAにフラグを立てるモジュール。正常に更新された項目。

すべてのプロセスは機能しますが、コンテナ管理のEntityManagerを使用して持続プロセス中に発生する可能性のある例外の管理方法がわかりません。

コンテナ管理のEntityManagerで作業していなかった場合、例外が発生した場合は、挿入ごとに新しいトランザクションを開き、コミットまたはロールバックします。

正常に更新されたアイテムのIDを持つリストに、現在処理中のアイテムのIDを追加して例外を発生させないために、例外が発生したことを知る必要があります。また、10個のアイテムを処理していて、リストの最初のアイテムが例外を作成した場合は、残りの9個のアイテムを続行する必要があります。

永続メソッドの前に@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)を使用すると、私の問題が解決するとは思っていましたが、それはできませんでした。

コンテナ管理のEntityManagerを使用して行う必要がある方法はありますか?

ありがとうございます。

答えて

0

クラスの定義に@TransactionManagement(TransactionManagementType.BEAN)を使用します。私は自分でトランザクションを管理することができました。

@Stateless 

@TransactionManagement(TransactionManagementType.BEAN) 
public class MyBean implements MyBeanInterface{ 
    @PersistenceContext 
    private EntityManager em; 
    @Resource 
    private UserTransaction userTransaction; 

    @Override 
    public List<String> updateItems(List<Items> items) { 
     List<String> itemsId=new ArrayList<String>(); 
     for(Item item : items){ 
      try{ 
       userTransaction.begin(); 
       doMyStuff(...); 
       userTransaction.commit(); 
       itemsId.add(item.getId()); 
      }catch(Exception e){ 
       try { 
        userTransaction.rollback(); 
       } catch (IllegalStateException e1) { 
        e1.printStackTrace(); 
       } catch (SecurityException e1) { 
        e1.printStackTrace();      
       } catch (SystemException e1) { 
        e1.printStackTrace(); 
       } 
      } 
     } 
     return itemsId; 
    } 
} 

それは働いていますが、私はそれを行うためのクリーンな方法があるかどうかを知りたいですか? 明示的なbeginTransaction、commitTransaction、およびrollbackTransactionを使用せずに意味します。 たとえば、メソッドの周りの注釈をdoMyStuff()で呼び出すことによって:

ありがとう。

0

毎回新しいトランザクションを作成する必要はありません。トランザクションをロールバックしたいときはいつでも、トランザクションを3つのレベルにロールバックすることができます.1)Use SetRollbackOnly 2)Mark Exception with ApplicationException 3)実行時のスロー(使用しないでください)