2013-01-21 2 views
3

У меня есть MDB EJB со статическим блоком внутри него. Я использовал статический блок для инициализации некоторых компонентов только один раз при первом запуске приложения (т. Е. При развертывании). MDB EJB развертывается на отдельном сервере (My_Server), отличном от Admin_Server.Статический блок называется дважды, может быть, несколькими загрузчиками классов?

Проблема в том, что статический блок вызывается дважды!

  • Первый раз: только после развертывания MDB EJB (tageted к my_server).
  • Второй раз: после очереди JMS (с которой связан MDB) получает сообщение.

Кроме того, я напечатал имя сервера и идентификатор процесса, и они же в обоих:

System.out.println("server name: " + System.getProperty("weblogic.Name")); 
System.out.println("pid: " + ManagementFactory.getRuntimeMXBean().getName().split("@")[0]); 

Я также заметил, что некоторые странное поведение. В основном, я приложил Крюк выключения (изнутри статического блока), чтобы отправить мне электронную почту при завершении работы приложения.

  • Я получил уведомление после того, как остановил My_Server.
  • Я получил уведомление также после завершения работы Admin_Server.

Как я могу решить эту проблему?


Некоторые дополнительные сведения:

Weblogic version: 10.3.0 
EJB version: 3.0 

ответ

7

Это происходит только тогда, когда у вас есть несколько загрузчиков классов. У меня не было бы статических инициализаторов в EJB, полагаться на крючки жизненного цикла EJB или экспортировать инициализатор в неуправляемый класс.

EJB 3.1 добавил аннотации, такие как @Singleton и @Startup, но, к сожалению, в 3.0 вы застряли в решениях для этих гарантий.

Администрирование по сравнению с обычным поведением сервера довольно распространено, поскольку WebLogic обычно развертывает оба. См. this page для получения дополнительной информации.

Для проверки ловушек Weblogic this documentation page.

+0

+1 Благодарю вас за ответ. Мне нужно сделать некоторые инициализации только один раз во время развертывания. Единственная аннотация JJB, которую я знаю, это '@ PostConstruct', и это неверно, так как Weblogic иногда создает несколько экземпляров MDB. Что вы подразумеваете под «Какой сервер приложений вы используете»? –

3

Да, единственный способ получить статический инициализатор, выполненный более одного раза, - это если вы действительно загрузили две разные копии этого класса. И это может произойти только в том случае, если у вас есть два разных загрузчика классов, которые загружают класс.

Способ предотвращения этого заключается в том, чтобы упорядочить классы, о которых идет речь, загружается общим загрузчиком классов предков двух загрузчиков классов. Я не знаю, как вы это сделаете с помощью Weblogic, но для Tomcat вы поместите соответствующие файлы JAR в назначенный общий каталог библиотек, который будет использоваться всеми веб-приложениями, запущенными в контейнере.

+0

У нас был.jar, который был загружен системным загрузчиком классов, а затем снова загрузчиком классов Tomcat. Мы удалили .jar из Tomcat webapp, чтобы исправить нашу проблему. – 11101101b

Смежные вопросы