Это нарушение ограничений EJB? - PullRequest
0 голосов
/ 27 января 2012

Я прочитал ограничения для EJB и несколько ответов здесь по stackoverflow, но я не совсем уверен насчет фрагмента кода, который я нашел на работе.

Есть сервис, который предоставляет подробную информациюо Foos в зависимости от их идентификатора.

public FooResponse getFoo(FooRequest request){...};

Где-то под поверхностью находится самописный пул, который содержит недавно предоставленные объекты ответа.Для каждого запроса пул спрашивается, есть ли доступная запись.Если да, то он используется в качестве ответа, а если нет, то запрашивается база данных.Когда ответ извлекается из базы данных, он сохраняется в пуле.

Пул использует две стратегии, чтобы позаботиться о его размере.Во-первых, он использует java.lang.ref.SoftReference<T> внутри Map, чтобы избежать OutOfMemoryError с.Второе, что он использует, - это java.util.TimerTask, который создается для каждой записи в Map и назначается java.util.Timer, который удаляет запись через настраиваемый промежуток времени.

Это вмое мнение, нарушающее ограничение, заключается в том, что EJB не разрешено создавать потоки (что делает java.util.Timer).Я прав или я что-то упустил?До сегодняшнего дня это не вызывало каких-либо явных проблем.Вы рекомендуете избавиться от этого самокодированного пула?

Другое дело, что сервис - это SessionBean без состояния.Контейнер создаст не только один из них.Поэтому они не используют один и тот же пул, и было бы удачей, если бы одному бину было предложено примерно Foo дважды.Я тоже с этим прав?

1 Ответ

2 голосов
/ 27 января 2012

Основная проблема с созданием ваших собственных потоков заключается в том, что они находятся вне контроля вашего сервера приложений, что может привести к сценариям, в которых мошеннический EJB-компонент "ломает сервер", создавая слишком много потоков.

Однако желательно иметь фоновые потоки, поэтому обычно серверы приложений предоставляют «менеджеров работ» для планирования задач (с таймером или параллельными потоками).

Вот статья на CommonJ с Websphere, в которойпредоставляет справочную информацию о том, как использовать потоки без прерывания работы сервера: Менеджеры работ

Вот как документы CommonJ Weblogic: API таймера и диспетчера работ

Хотя это, возможно, не по теме, вот как Spring интегрируется с менеджерами работ: Выполнение и планирование задач

Чтобы решить вашу проблему, я бы интегрировал с кешем (например, EHCache ) и дайте ему понять, когда извлекать элементы из кэша.

(Опять же, возможно, не по теме, используя Spring, можносделать использование кэша вопросом добавления аннотаций к вашему коду: ehcache-spring-annotations )

...