Я отвечаю за JBoss AS, так как у меня ограниченный опыт работы с другими AS: s.
Удаленные JNDI-ссылки - это просто (балансировка нагрузки) прокси-серверы без соединения (см. Архитектура прокси кластеризации JBoss ). Сериализация их - это хорошо, это означает, что вы можете сохранять их как члены в других EJB-компонентах и кэшировать их, как вы делаете (я не знаю, сериализует ли ваш пул ваши объекты, некоторые кеши делают).
Относительно аннулирования прокси:
Прокси-серверы будут открывать соединение только на время вызова метода и, следовательно, не имеют «подключенного» состояния как такового. Прокси могут дополнительно иметь несколько IP-адресов и балансировку нагрузки. В JBoss список узлов динамически обновляется при каждом вызове метода, поэтому риск устаревания ссылки невелик. Тем не менее, существует вероятность того, что это произойдет, если все узлы выйдут из строя или прокси останется неактивным, а все IP-адреса узлов устареют. В зависимости от политики повторного использования пула (LRU или другой?) Вероятность того, что остальные кэшированные прокси-серверы будут недействительными, один из них будет варьироваться. Справедливая политика сведет к минимуму риск наличия в пуле очень старых записей, которых вы бы хотели избежать в этом сценарии.
При наличии справедливой политики вероятность того, что все устареют по одной и той же причине, возрастет, и ваша политика «чистого пула, если одна устарела» будет иметь смысл. Кроме того, вам нужно принять во внимание случай, когда другой узел не работает. Как и сейчас, ваш алгоритм перейдет в занятый цикл, просматривая ссылки, пока другой узел не работает. Я бы реализовал экспоненциальный откат для повторных попыток или просто рассмотрел бы его как фатальный сбой и сделал бы исключение исключением времени выполнения, в зависимости от того, можете ли вы жить с удаленным удаленным EJB-компонентом на время или нет. И сделайте исключение, которое вы отлавливаете, конкретным (например, RemoteCommunicationFailedException), избегайте отлова общих исключений или ошибок, таких как Exception, Error или Throwable.
Другой вопрос, который вы должны задать себе, - это количество параллелизма, которое вы хотите. Обычно прокси являются поточно-ориентированными для SLSB и однопоточными только для SFSB. Сами SFSB не являются поточно-ориентированными, а SLSB сериализуют доступ по умолчанию. Это означает, что, если вы не включите параллельный доступ к вашим EJB 3.1 bean-компонентам (см. tss link ), вам понадобится одна удаленная ссылка на поток. То есть: объединение N удаленных ссылок SLSB даст вам N потоков одновременного доступа. Если вы включаете параллельный доступ и пишете свой SLSB в виде потоково-безопасного компонента с аннотацией @ConcurrencyAttribute(NO_LOCK)
, вы можете получить неограниченный параллелизм только с одним прокси-сервером и удалить весь пул. Ваш выбор.
EDIT:
ewernli был прав: потокобезопасный SLSB-прокси создает один новый экземпляр на сервере за вызов. Это указано в 4.3.14:
Нет необходимости в каких-либо ограничениях
против одновременного доступа клиента к
сессионные компоненты без сохранения состояния, потому что
Контейнер направляет каждый запрос к
другой экземпляр лица без гражданства
класс сессионного компонента.
Это означает, что вам вообще не нужен пул. Просто используйте один удаленный реф.