Spring + EJB 3.1 CMT与BMT事务

时间:2011-06-14 02:54:31

标签: java spring java-ee ejb-3.1

我们有一个简单的无状态EJB计时器,它获取一个注入Spring服务的实例。 spring服务有一个标记为transactional的方法。当EJB使用事务管理类型CONTAINER时,spring服务调用会导致IllegalStateException:不允许操作。因此,我们将EJB事务管理类型设置为BEAN,并且所有内容都按照广告的方式工作。这是正常的吗?我的印象是春季交易管理会加入CMT。

示例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(){

    }
}

1 个答案:

答案 0 :(得分:0)

如果您要将Spring事务的传播级别定义为SUPPORTS(默认为REQUIRED),则问题可能会得到解决。我不记得EJB中默认设置的确切值,但似乎EJB方法没有启动事务(传播是DEFAULT),但是'hello'尝试这样做并且这会导致冲突。