Social Icons

.

понедельник, 10 февраля 2014 г.

Lookup EJB

Пусть есть потребность обнаружить EJB компонет, не прибегая к помощи аннотаций  и описаниям в файлах ejb-jar.xml или ibm-ejb-jar.xml. (Такая необходимость регулярно возникает, когда на момент разработки вам известен интерфейс бина, но неизвестен сам бин). 
Пусть бин и вызывающее его приложение заведомо запущено на одном сервере приложений (это "неправильное" ограничение, но решение проблемы разных серверов уведет нас в другую задачу, а потому, пока будем работать в тепличных условиях).
Пусть необходимо обеспечить работу кода для WAS и JBOSS одновременно.

Во-первых, собственно, код поиска.


private IMyBean bean( String szPath){
 IMyBean theBean = null;
 try{
  InitialContext ctx = new InitialContext( );
  Object theObject =  ctx.lookup( szPath );
  theBean = (IMyBean) PortableRemoteObject.narrow(theObject, IMyBean.class);
  log.info("IMyBean bean was loaded. Version is " + theBean.version() );
 }
 catch(Exception Ex){
  log.severe("Exception: " + Ex.getMessage() );
  theBean = null;
 }
 return theBean;
}

На что тут следует обратить внимание.
1. PortableRemoteObject.narrow не нужен в JBOSS. Он не замечен за тем, что путает типы объектов. Хотя этот метод и не помешает ему отработать правильно. А вот в WAS, без этого метода (при обычном приведении типа) будем три раза из десяти получать исключение о несоответствии типа объекта.
2. Если открыть мануалы и почитать их внимательно, то мы найдем там строгую рекомендацию вызывать new InitialContext( ) с параметрами и массу рекомендаций о правилах выбора этих параметров. Это все верно. Только необходимо это исключительно для тех случаев, когда бин и вызывающий его элемент расположены на разных серверах. Это большая серьезная тема, но мы ее сейчас отсекли (см. условия)
3. JBOSS выдает осмысленную информацию о бине, весьма полезную при дебаге, на вызов метода theBean.toString(). Однако WAS на этот метод дает просто бинарный дамп бина, мало того что бесполезный, так еще и огромного размера. Если не лень повозится с дополнительным параметром - рекомендую использовать  theBean.toString() при работе с JBOSS.

Во-вторых, параметр поиска - szPath


protected final String  IMYBEAN_PATH_WAS = 
"ejb/EAR_NAME/JAR_NAME.jar/BEAN_NAME#ru.company.project.IMyBean";

protected final String  IMYBEAN_PATH_JBOSS = 
"ejb:EAR_NAME/JAR_NAME//BEAN_NAME!ru.company.project.IMyBean";

Строчки поиска компонента очень похожи для различных серверов, но отличаются. Заострим внимание на различиях:
1.Имя проекта отделено от тега ejb символом '/' или символом ':'
2.Имя Jar-ника EJB project используется в одном случае с расширением jar, в другом - нет.
3. В одном случае после имени  EJB project есть еще одно поле (чаще всего пустое и выраженное как //), в другом случае его вообще нет.
4. Разделитель между именем бина и путем к его интерфейсу либо '#' либо '!'

Источник
Источник(!)
Источник

Комментариев нет:

Отправить комментарий

 

Так говорил Учитель:

У хорошо написанной программы есть свой собственный рай, у плохо написанной — свой собственный ад.

Russian Developer

Взгляд его светел, усилия праведны, старания бесплодны, дело безнадежно ...