Хотя в спецификации EJB3.1 представлен синглтон, а ваша версия JBoss его не поддерживает, вы можете использовать аннотацию JBoss @Service для создания синглтона. Инструкция здесь . Кроме того, кажется, что у вас есть JBoss, настроенный для изоляции ваших ejb-файлов и войн друг от друга. Вам не нужно этого делать. Вы можете посмотреть тег loader-repository в специфических XML-файлах jboss, чтобы все ваше ухо разделяло один загрузчик классов (или, возможно, по крайней мере две войны делят один загрузчик классов).
При всем этом, я согласен с @duffymo, что синглтон, который разделяет состояние между двумя войнами, - это идея, что вы должны идти, если не убегать.
Редактировать: Что касается синглетонов, я предлагаю вам посмотреть на такие вопросы, как этот (который также имеет некоторый хороший баланс в комментариях).
Идея о том, что объект хранит кэшированное состояние само по себе, является приемлемой, особенно с EJB3, где вы можете вводить свое состояние вместо статической ссылки на него (если вы используете аннотацию @Service, то вы хотите, чтобы JDoss определялся @Depends аннотация). При этом, если бы вы использовали здесь «правильный» синглтон, то я ожидал бы, что ваша единственная проблема с тем фактом, что ваши WAR-файлы имеют два отдельных загрузчика классов, - это дополнительный объем памяти. В противном случае вы попадете в проблемную область синглетонов (где они должны быть инициализированы для использования, все, что их использует, должно гарантировать, что они инициализируются первыми, и, конечно, весь код тесно связан с их инициализацией).
Там, где синглтоны действительно очень плохи, они хранят состояние, так что один класс может изменить состояние, а другой - его забрать. По сути, в EJB-компонентах нет версии 3.1, и даже тогда возникает много проблем с параллелизмом.
Редактировать (далее): Итак, вы хотите использовать репозиторий загрузчика классов. Я использую JBoss 4.2.3, поэтому я не обязательно знаю все входы и выходы JBoss5 (который переписал свой загрузчик классов, хотя говорят, что он почти полностью совместим с предыдущими версиями), однако в 4.2.x по умолчанию ваша конфигурация не вызывает проблемы, потому что все уши, развернутые на сервере, используют один и тот же загрузчик классов («унифицированный загрузчик классов»). Я подозреваю, что сервер, на котором вы развертываете, имеет конфигурацию по-другому, поэтому я не уверен, как с ним взаимодействовать, но вам нужно добавить файл с именем jboss-app.xml в ваше ухо (в то же местоположение, что и application.xml), которое выглядит примерно так:
<?xml version="1.0"?>
<!DOCTYPE jboss-app PUBLIC "-//JBoss//DTD J2EE Application 4.2//EN"
"http://www.jboss.org/j2ee/dtd/jboss-app_4_2.dtd">
<jboss-app>
<loader-repository>
com.yourcomany:archive=yourear
</loader-repository>
</jboss-app>
Это для JBoss 4.2. 5.1 имеет теги того же типа, вот xsd . У него та же концепция загрузчика-хранилища.
Что должно быть этим. То есть до тех пор, пока у вас нет эйб-фляги, войны и т. Д., Им это не нужно. Однако для ваших войн (в jboss-web.xml - в том же месте, что и в web.xml) может потребоваться то же самое. В этом случае, если вы называете репозиторий точно таким же образом (если я правильно понимаю - никогда не пробовал сам), они будут использовать один и тот же загрузчик классов. То же самое касается EJB, настроенного в jboss.xml, который находится в том же месте, что и ejb.xml.
Это может сделать это немного яснее.