2011-06-14 72 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),但'你好'试图这样做,这是导致冲突。