Мне интересно, как @TranscationTimeout обрабатывается WildFly, особенно при вызове чужого EJB-метода, аннотированного @TransactionAttribute, но не самого @TransactionTimeout.
Я искал Документация WildFly , API Docs и, конечно, гуглил, но я не могу найти никаких утверждений.
Рассмотрим следующий сценарий. У нас есть EJB без сохранения состояния A и B.
@Stateless
public class A {
@Inject
private B b;
@TransactionTimeout(unit = TimeUnit.MINUTES, value = 10)
public void t() {
b.t();
}
}
@Stateless
public class B {
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
public void t() {
}
}
При вызове клиентом я ожидаю:
- A :: t выполняется в транзакции с таймаутом 10 минут
- B :: t выполняется в новой транзакции с тайм-аутом по умолчанию для контейнера (5 минут в WildFly)
- B :: t в A :: t выполняется в своей новой транзакции с тайм-аутом по умолчанию для контейнера(5 минут в WildFly)
Что происходит:
- B :: t в A :: t выполняется в своей новой транзакции с тайм-аутом 10 минут
Кажется, что @TransactionTimeout наследуется вложенным EJB-методам, если они каким-либо образом не аннотированы @TransactionTimeout, соответственно, контейнер по умолчанию переопределяется при их вызове. Требуется ли такое поведение? Существуют ли исключения?
Я использую WildFly 10.1.0 с Java 8.