размер пула сессионных компонентов - PullRequest
4 голосов
/ 16 июня 2011

изучаю материал корпоративного сессионного компонента. У меня есть сомнения по поводу нижеуказанных признаков: -

1) Допустим, мы упомянули размер пула как 50 для некоторого статичного сессионного компонента. Их используют 50 разных клиентов. так что теперь все 50 бобов поддерживают некоторое состояние. В какой момент времени эти состояния будут удалены, чтобы если 51-й клиент просит боб, он не получает никакого предыдущего испорченного состояния.

2) Допустим, мы упомянули размер пула как 50 для некоторого сессионного компонента без сохранения состояния, и все они используются в некоторых точка времени. Если приходит 51-й клиент и спрашивает о бобе, будет ли это ждать, пока какой-то бин не станет свободным или создать новый экземпляр компонента?

Ответы [ 2 ]

5 голосов
/ 18 июня 2011

Как заявляет 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-компонентов по умолчанию ТРЕБУЕТСЯ».

5 голосов
/ 16 июня 2011

Сессионные компоненты Stateful обычно не объединяются.Это возможно, но их состояние делает их менее идеальными для объединения в пул, поскольку клиент ожидает получения нового компонента при получении ссылки.

Для компонентов без состояния да 51-му клиенту придется подождать.Обычно это хорошая вещь, поскольку она автоматически снижает потребление ресурсов вашей системой.В зависимости от имеющихся у вас ресурсов, рабочей нагрузки и объема работы, выполняемой за один вызов ssb, вы можете настроить размер пула.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...