2016-08-10 15 views
0

私は、エンティティにアクセスして新しいデータでそれを更新し、それをJMSキューに送信し、このエンティティをデータベースに保存/永続化するコードを実装することになっているMDBによって消費されるEJBを持っています。現在、このBeanのエンティティを更新し、自身で変更をデータベースにコミットしHibernateエンティティオブジェクトを別のメソッドに渡してデータベースに保存するにはどうすればいいですか?

@Stateless(mappedName = "AccountAccessBean") 
@TransactionManagement(value=TransactionManagementType.CONTAINER) 
@LocalBean 
public class AccountAccessBean { 

    @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW) 
    public void resigterAccountEvent() { 

     Calendar calendar = Calendar.getInstance(); 
     Date now = calendar.getTime(); 

     Configuration configuration = new Configuration().configure(); 
     ServiceRegistry registry = new StandardServiceRegistryBuilder() 
       .applySettings(configuration.getProperties()) 
       .build(); 
     SessionFactory sessionFactory = configuration 
       .addAnnotatedClass(Account.class) 
       .addAnnotatedClass(Accountaccesslog.class) 
       .buildSessionFactory(registry); 
     Session session = sessionFactory.openSession();  
     Transaction transaction = session.beginTransaction(); 

     Account accountEntity = (Account) session.get(Account.class, new Integer(1)); 
     accountEntity.setAccessCount(accountEntity.getAccessCount() + 1); 

     Accountaccesslog accountAccessLogEntity = new Accountaccesslog(); 
     accountAccessLogEntity.setAccessDateTime(new Timestamp(now.getTime())); 
     accountEntity.addAccountaccesslog(accountAccessLogEntity); 
     session.save(accountAccessLogEntity); 

     transaction.commit(); 
     session.close(); 

     EntityEnqueueBean enqueueObject = new EntityEnqueueBean(); 
     enqueueObject.enqueueEntity(accountEntity); 
    } 
} 

AccountAccessBean.java:ここでは、データベースからエンティティにアクセスするEJBです。私は、JMSメッセージを受信し、次のMDBへのコードの「コミット」部分を移動したい:

AccountPersistenceMDB.java

@MessageDriven(
    activationConfig = { @ActivationConfigProperty(
      propertyName = "destinationType", propertyValue = "javax.jms.Queue"), 
      @ActivationConfigProperty(propertyName = "destination", 
      propertyValue ="java:/jms/queue/AccountAccessQueue") 
    }) 
public class AccountPersitenceMDB implements MessageListener { 

    public void onMessage(Message message) { 
     ObjectMessage objectMessage = null; 
     objectMessage = (ObjectMessage) message; 
     try { 
      Account accountEntity = (Account) objectMessage.getObject(); 
     } catch (JMSException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

私はこれを実装するかどうかはわかりません。また、accountEntityオブジェクトと一緒にセッションオブジェクトまたはトランザクションオブジェクトを渡す必要がありますか?どんな助けや指導も大歓迎です。

答えて

0

は、次の2つの操作

  1. アクセスentitityを持っており、

あなたの取引はとの両方を囲むべきではないことができないJMSメッセージを消費し、データベースにコミットJMSメッセージを送信します操作

JMSメッセージは、

消費者(s)は十分
  • がパブリッシャ
  • に別のマシン上で消費され再生される複数の消費者が消費され、迅速に消費することができない場合

    1. は、キューに入れなさいJMS消費とデータベースコミットを単一のトランザクションとして結合する方法の詳細については、here

      を参照してください。
    関連する問題