Spring + EJB 3.1 CMT vs BMT transactions


У нас есть простой таймер EJB без состояния, который получает экземпляр службы spring, введенный в него. Весенняя служба имеет метод, отмеченный как транзакционный. Когда EJB использует управления контейнер тип сделки весеннее обслуживание вызов приводит к IllegalStateException: операция не разрешена. Поэтому мы установили тип управления транзакциями EJB BEAN, и все работает так, как рекламируется. Это нормально? Я был под впечатлением, что весной управление транзакциями присоединится к КРТ.

Пример 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 2

1 ответ:

Вероятно, проблема может быть исправлена, если вы бы определили уровень распространения для Spring transaction в качестве опор (по умолчанию требуется). Я не помню точное значение для настроек по умолчанию в EJB, но похоже, что метод EJB не запускает транзакцию (распространение по умолчанию), но "hello" пытается сделать это, и это вызывает конфликт.