Как заявляет bkail, семантика пула bean-компонентов @Stateless зависит от поставщика. Тем не менее, в EJB 3.1 мы добавили аннотацию @AccessTimeout
, которую можно использовать в классе компонента или методах компонента @Stateless
, @Stateful
или @Singleton
.
@ AccessTimeout
В общем смысле эта аннотация переносимо указывает, как долго абонент будет ждать, если возникнет условие ожидания при одновременном доступе. Специфичные для каждого типа бинов условия ожидания будут возникать, когда:
@Singleton
- вызывается метод @Lock(WRITE)
и используется параллелизм, управляемый контейнером. Все методы @Lock(WRITE)
по умолчанию.
@Stateful
- любой метод экземпляра вызывается и происходит второй вызов. ИЛИ бин @Stateful находится в транзакции, и вызывающая сторона вызывает его извне этой транзакции.
@Stateless
- в пуле нет доступных экземпляров. Как уже отмечалось, однако, семантические пулы, если таковые имеются, не охватываются спецификацией. Если семантика пула поставщика включает условие ожидания, должно применяться @AccessTimeout.
Использование
@AccessTimeout
- это просто удобная оболочка для кортежей long
и TimeUnit
, обычно используемых в java.util.concurrent
API.
import java.util.concurrent.TimeUnit;
@Target({METHOD, TYPE})
@Retention(RUNTIME)
public @interface AccessTimeout {
long value();
TimeUnit unit() default TimeUnit.MILLISECONDS;
}
Когда он явно задан для класса или метода bean-компонента, он имеет три возможных значения:
@AccessTimeout(-1)
- Никогда не превышайте время ожидания, подождите столько, сколько потребуется. Потенциально навсегда.
@AccessTimeout(0)
- Никогда не жди. Немедленно бросьте ConcurrentAccessException
, если возникнет условие ожидания.
@AccessTimout(30, TimeUnit.SECONDS)
- подождать до 30 секунд, если возникнет условие ожидания. После этого бросьте ConcurrentAccessTimeoutExcpetion
Нет стандартного значения по умолчанию
Обратите внимание, что атрибут value
не имеет значения по умолчанию. Это было сделано намеренно и предназначено для сообщения о том, что если @AccessTimeout
не используется явно, поведение, которое вы получаете, зависит от поставщика.
Некоторые поставщики будут ждать предварительно настроенное время и выбрасывают javax.ejb.ConcurrentAccessException
, некоторые поставщики будут выбрасывать его немедленно. Когда мы определяли эту аннотацию, стало ясно, что все мы, поставщики, действовали немного по-разному, и применение значения по умолчанию вызовет проблемы для существующих приложений.
В аналогичной заметке, до EJB 3.0 не было атрибута транзакции по умолчанию, и он был разным для каждого поставщика. Слава Богу, EJB 3.0 отличался настолько, что мы могли наконец сказать: «Для EJB 3.0 bean-компонентов по умолчанию ТРЕБУЕТСЯ».