В кодовой базе, которую я унаследовал, есть MDB
, который вызывает SingletonBeanFactoryLocator().getIntance().useBean()
, чтобы получить ссылку на фабрику в своем ejbCreate()
, а затем получает конкретный bean-компонент из этой фабрики и сохраняет его как переменную экземпляра MDB
. (Фабрика имеет тип 'ClassPathXmlApplicationContext
').
Смущает следующее: после того, как этот bean-компонент получен, он вызывает 'release()
' для этой фабричной ссылки в том же самом ejbCreate()
.
Теперь этот MDB
объединен в пул с размером пула 'x
', и я заметил, что bean-компоненты, определенные в context xml
, создаются 'x
' количество раз. Итак, я предполагаю, что каждый раз, когда выполняется 'ejbCreate()
', он заново создает контекст и его компоненты.
Я проверил документ Spring для 'release()
выше, в котором говорится:
In an EJB usage scenario this would normally be called from `ejbRemove()` and `ejbPassivate()`.
Итак, вот мои вопросы:
1) действительно ли создается новый контекст и вызывается новый bean-компонент everytime ejbCreate()
?
2) если да, то что происходит с контекстом/компонентами, созданными в предыдущем вызове (например, если сами компоненты являются одноэлементными, будут ли они уничтожены)?
3) это правильный способ использования SingletonBeanFactoryLocator
(возможно, из-за проблем с безопасностью потоков) в контексте выше?
4) если нет, то как является правильным способом его использования?
РЕДАКТИРОВАТЬ: одна из возможностей, о которой я могу думать, - это сделать соответствующие bean-компоненты prototype
, чтобы сделать каждый экземпляр MDB потокобезопасным, поэтому нет необходимости освобождать и воссоздавать контекст. Жду других комментариев/предложений.
@PreDestory
вместо@PostConstruct
. Это имеет несколько преимуществ, например, контекст уничтожается, как только все bean-компоненты не развернуты. 06.08.2012