2014-04-08 56 views
1

我有我的消息驅動的Bean注入的EntityManager使用的Spring bean作爲服務(引導與的SpringBeanAutowiringInterceptor做了一個問題EJB與春天:在JPA沖洗交易問題

下面是代碼:

@MessageDriven(name = "ProcessMDB") 
@Interceptors(SpringBeanAutowiringInterceptor.class) 
public class ProcessMDB implements MessageListener { 

    @Autowired 
    private ProcessService processService; 

    @Override 
    public void onMessage(Message message) { 
     try { 
      id = message.getLongProperty("ID"); 
      processService.process(id); 
     } catch (Exception e) { 
      // Handle error. 
     } 
    } 

流程服務具有其中的EntityManager注入與註釋@PersistentContext一個DAO ...

的問題是,如果在processService發生JPA誤差,也可以在entityManager.flush期間可能發生它( )調用...所以try catch塊消失了,// Handle錯誤的東西沒有完成。

所以我試圖手動添加刷新。

@MessageDriven(name = "ProcessMDB") 
@Interceptors(SpringBeanAutowiringInterceptor.class) 
public class ProcessMDB implements MessageListener { 

    @Autowired 
    private ProcessService processService; 

    @PersistenceContext 
    private EntityManager em; 

    @Override 
    public void onMessage(Message message) { 
     try { 
      id = message.getLongProperty("ID"); 
      processService.process(id); 
      em.flush(); 
     } catch (Exception e) { 
      // Handle error. 
     } 
    } 

但似乎沖洗沒有效果。

我嘗試添加em.flush底層DAO(剛過持續實例)和它的作品!異常被提出並且catch塊被執行。但是,如果將em.flush()放在MessageDrivenBean級別,它就不起作用。

我認爲這是事務管理問題......春豆EntityManager的是不在同一TX比我的EJB注入實體管理器。

如果我讓在onMessage()方法em.find,所獲取的對象保存舊值(一個數據庫中),而不是在服務方法改變的值。

<jee:jndi-lookup id="emf" jndi-name="persistence/PUnit" /> 

和我的TX經理如下::

<tx:annotation-driven/> 

<tx:jta-transaction-manager /> 

什麼我錯了

的後跟我已配置我的數據庫?

有人可以幫我嗎?

感謝

斯特凡

回答

0

你注入ProcessMDBEntityManager,但對象是ProcessService正在持續。

現在,如何能在ProcessMDB任何操作都會影響ProcessService,都將有可能自己的個人EntityManager

PersistenceContext的範圍是高達相關EntityManager。對象將在ProcessService &不ProcessMDB的背景下,因此呼籲後沖水將沒有任何效果&這是預期的行爲。

+0

這使感官。但是由於我在同一個事務中,我期望容器在ProcessService和ProcessMDB中都提供相同的「共享」實體管理器。如果我做了。在MDB中查找(id),返回的對象具有來自DB的值,而不是在processService中更新的最後一個值(因爲沒有執行刷新)... –

+0

@StéphaneProcessService.process()的事務屬性是什麼 –

+0

默認值:必需。 –