我们有一个简单的无状态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(){
}
}
答案 0 :(得分:0)
如果您要将Spring事务的传播级别定义为SUPPORTS(默认为REQUIRED),则问题可能会得到解决。我不记得EJB中默认设置的确切值,但似乎EJB方法没有启动事务(传播是DEFAULT),但是'hello'尝试这样做并且这会导致冲突。