EJB 3.1 представил аннотации, связанные с тайм-аутом, как часть своего API.
- @AccessTimeout
- @StatefulTimeout
Давайте быстро посмотрим на то, что они и почему они важны
@AccessTimeout
Задает период времени, по истечении которого время ожидания в очереди (ожидание завершения другого потока) истекает.
@Singleton @ConcurrencyManagement(ConcurrencyManagementType.CONTAINER) //this is actually by default public class Singleton_With_Timeout{ @AccessTimeout(5000,java.util.concurrent.TimeUnit.MILLISECONDS) @Lock(LockType.WRITE) //default configuration public void find(){ //... business logic } }
Какие бобы могут использовать эту аннотацию?
Это применимо для
- Stateful (@Stateful) бины и
- Синглтон- бины (@Singleton), настроенные с параметром управляемого параллелизма контейнера (ConcurrencyManagementType.CONTAINER)
Почему это важно ?
Поскольку контейнер EJB сериализует параллельные запросы, наличие этой аннотации гарантирует, что потенциальные (ожидающие) потоки не будут заблокированы навсегда, и помогает определить политику параллелизма .
Где я могу разместить эту аннотацию?
- По классу — глобально относится ко всем методам
- Только по определенному методу
- На конкретный метод, чтобы переопределить настройки аннотации уровня класса
Как это использовать ?
Вы можете использовать элементы value и unit этой аннотации, чтобы определить ее поведение
Вот несколько вариантов
- @AccessTimeout (0) — это означает, что ваш метод вообще не поддерживает одновременный доступ, и клиент получит исключение java.ejb.ConcurrentAccessException
- @AccessTimeout (-1) — ваш метод будет блокироваться на неопределенный срок (я не думаю, что это хорошая идея!)
- @AccessTimeout (5000) — метод будет ожидать 5000 мс (5 секунд) перед следующим потоком в очереди (если есть), если есть возможность
Несколько вещей, чтобы отметить
- Значением по умолчанию для элемента unit является java.util.concurrent.TimeUnit.MILLISECONDS
- значение тайм-аута меньше -1 недопустимо
@StatefulTimeout
Определяет пороговый предел для исключения незанятых сессионных компонентов с состоянием, то есть тех, которые не получили клиентские запросы в течение определенного интервала
@StatefulTimeout(15000,java.util.concurrent.TimeUnit.MILLISECONDS) public class SFSB_With_Timeout{ public void register(){ //....business logic } }
Представьте, что у вас есть сессионный компонент с состоянием, обрабатывающий рабочий процесс регистрации пользователей. Пользователь неактивен в течение определенного промежутка времени (возможно, делает другие вещи). Как долго вы хотите, чтобы ваш сессионный компонент с состоянием был активен в памяти? Настройка этой аннотации может помочь предотвратить перегрузку основной памяти неактивными экземплярами бинов.
Где я могу разместить эту аннотацию?
Те же правила, что и у аннотации @AccessTimeout!
Как это использовать ?
Вы можете использовать элементы value и unit этой аннотации, чтобы определить ее поведение
Вот несколько вариантов
- @StatefulTimeout (0) — это означает, что ваш экземпляр компонента будет удален сразу после завершения метода, который содержит эту аннотацию
- @StatefulTimeout (-1) — ваш метод не будет чувствителен к тайм-аутам (человек упрямый!)
- @StatefulTimeout (15000) — метод будет ждать 15000 мс (15 секунд) клиентских запросов, прежде чем станет кандидатом на выселение
Несколько вещей, чтобы отметить
- Значением по умолчанию для элемента unit является java.util.concurrent.TimeUnit.MILLISECONDS
- значение тайм-аута меньше -1 недопустимо
Ура!