Статьи

Политики тайм-аута для EJB: как они помогают …?

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
    }
}
Когда ваши экземпляры сессионных компонентов бомбардируются параллельными запросами, контейнер EJB обеспечивает исправность, сериализуя эти вызовы, т.е. блокируя другие потоки, пока текущий поток не завершит выполнение. Вы можете улучшить это поведение, используя эту аннотацию.

Какие бобы могут использовать эту аннотацию?

Это применимо для

  • 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 недопустимо

Ура!