2013-03-15 75 views
0

我是一個CDI和EJB的新手,我剛剛創建了一個jboss Web應用程序。不過,另外,我還希望這個應用程序處理rabbitmq消息。當處理這些時,我想做一些持久化工作,但是,由於我一直在監聽從@Startup註釋開始的應用程序作用域bean的rabbitmq消息,因此我無法在此範圍內提交任何事務也就是說,當我離開應用程序範圍時,我將從此範圍中安裝的每個bean都將成爲應用程序範圍。當我嘗試執行em.getTransaction()和em.commit()時,代碼會引發抱怨,我無法在JTA事務下調用getTransaction(),並且當我使用用戶事務時,每個操作似乎都被放到同一事務中它終於回滾了,或者出現錯誤,抱怨已經有一個正在進行的交易......從應用程序範圍內遺傳「事件作用域」bean

+0

我注意到這個問題被投票結束。請不要這樣做,並對其進行評論,以便我可以改進它。謝謝。 – 2013-03-16 11:37:50

+2

「不能在這種範圍內提交任何事務」您是什麼意思,您是否遇到錯誤?交易沒有開始?事務回滾?另外,我認爲發佈一些代碼可以幫助我們理解這個問題。 – ben75 2013-03-16 21:29:27

+0

我編輯了這個問題,並進一步澄清 – 2013-03-17 12:22:11

回答

1

CDI bean不像EJB那樣支持開箱即用的交易。所以你的選擇是:

  1. 在收到RabbitMQ消息後,調用一些EJB(直接或通過觀察者)來完成持久化工作。
  2. 使用以下任一操作將交易支持添加到您現有的CDI豆 - Apache DeltaSpikeSeam Persistence

根據您提供的信息確實很難給您更多的細節。但是,在概念層面上,上述方法之一可以做到這一點。

此外,event scope的概念似乎令人困惑。我會說你不需要它。上述方法之一將會做。另外,請看CDI events