Пусть есть потребность обнаружить 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. Разделитель между именем бина и путем к его интерфейсу либо '#' либо '!'
Источник
Источник(!)
Источник
Комментариев нет:
Отправить комментарий