2011-06-14 80 views
2

我們有一個簡單的無狀態EJB計時器,它可以獲得注入Spring服務的實例。春季服務有一個標記爲交易的方法。當EJB使用事務管理類型CONTAINER時,spring服務調用會導致IllegalStateException:Operation不允許。因此,我們將EJB事務管理類型設置爲BEAN,並且一切都按照廣告方式工作。這是正常的嗎?我的印象是春季交易管理會加入CMT。Spring + EJB 3.1 CMT與BMT交易

例如EJB

@Stateless 
@TransactionManagement(TransactionManagementType.CONTAINER) 
@Interceptors(SpringBeanAutowiringInterceptor.class 
public class TimerService { 
    @Autowired 
    IHelloService helloService; 

    @Schedule(second="*/1", minute="*",hour="*", persistent=false) 
    public void doWork(){ 
     helloService.hello(); 
    } 
} 

例如春季服務

@Service 
public class HelloService implements IHelloService { 
    @Transactional 
    public void hello(){ 

    } 
} 
+0

你使用哪個spring transaction manager?一般來說,我會在Spring或EJB中執行事務,而不是在兩個地方執行事務。 – 2013-12-29 11:44:57

+0

這是一年半前回答的... – joekarl 2013-12-30 00:45:57

回答

0

也許這個問題可以解決,如果你需要定義傳播水平Spring的事務作爲載體(默認是必需的) 。我不記得EJB中的默認設置的確切值,但它看起來像EJB方法不是開始事務(傳播是DEFAULT),但'你好'試圖這樣做,這是導致衝突。