Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java EE (J2EE) и Spring > проблема с InputStream передачей в EJB


Автор: polosatij 28.11.2008, 17:30


хая всем =)

вылезки грабли при передачи InputStream из MBean в EJB: Stateless Session Bean. Это по сути два разных jar-a. Стрим открывается из jar-a где находится MBEan. На вход в EJB похоже либо вообще ничего не приходит, либо приходит мусор.

попробовал передать Stream из файловой системы:

Код

        return new FileInputStream(TMP_AIXM_DIR + pAIXMFilePath);


ошибка:

Код

14:53:46,344 FATAL [AIXMParserUtil] Bad file descriptor
com.ctc.wstx.exc.WstxIOException: Bad file descriptor
        at com.ctc.wstx.stax.WstxInputFactory.createSR(WstxInputFactory.java:452)
        at com.ctc.wstx.stax.WstxInputFactory.createSR(WstxInputFactory.java:498)
        at com.ctc.wstx.stax.WstxInputFactory.createSR(WstxInputFactory.java:510)


млин.. второй вариант сделал просто для теста. можно конечно передать просто path, но такой вариант меня не устраивает из за того, что в мою систему приходит большой стреам и сохранять его на жёском мне бы не очень хотелось..

есть у кого какие другие мысли?   smile 

заранее пасиба  smile 

Автор: MisterCleric 28.11.2008, 17:53
Здравствуй.
Слушай, то ли я толком не понял, что тебе надо. То ли я не все знаю.
Но по-моему в спецификации EJB ясно написано, что низя работать с файлами, так как файл-дескрипторы, которые открывает java ссылаются на системные объекты, т.е. в операционку.
Да и вообще при вызове EJB-методов в нормальном распределенном приложении неизвестно, с какого места мы получили сам бин. Т.е. в результате лукапа он может приехать и с другой java-машины. Обернуться в RMI-вызов наконец. От сюда делаем выводы: передать в методы бина мы можем только серриализуемы объекты и простые типы. Согласно твоему топику ты передаешь несерриализуемый InputStream.
Надо менять логику, что бы в EJB уже передавать объект. 
Да и разве это бизнес-объект (InputStream), с какими и должны работать бизнес-методы?

Автор: polosatij 28.11.2008, 17:59
Цитата(MisterCleric @  28.11.2008,  17:53 Найти цитируемый пост)
Слушай, то ли я толком не понял, что тебе надо. То ли я не все знаю.
Но по-моему в спецификации EJB ясно написано, что низя работать с файлами, так как файл-дескрипторы, которые открывает java ссылаются на системные объекты, т.е. в операционку.
Да и вообще при вызове EJB-методов в нормальном распределенном приложении неизвестно, с какого места мы получили сам бин. Т.е. в результате лукапа он может приехать и с другой java-машины. Обернуться в RMI-вызов наконец. От сюда делаем выводы: передать в методы бина мы можем только серриализуемы объекты и простые типы. Согласно твоему топику ты передаешь несерриализуемый InputStream.
Надо менять логику, что бы в EJB уже передавать объект. 
Да и разве это бизнес-объект (InputStream), с какими и должны работать бизнес-методы? 


ты правильно понял.. и я так понимаю, ты прав, возьмём даже ситуацию с удалённым объектом EJB.. конечно же, наврятли ява будет передавать некий поток по сети *рен его знает куда.. хм.. тересна.. но у меня всё бегает на одной машине.. тересна можно ли extends InputStream и implements Serializable.. возможно можно, но вдруг мои рано или поздно решат разделить приложения по разным машинам.. хмммм.. тогда остаётся одно, передать path и на другом конце проверить, есть ли такой в системе..  smile 

Автор: Asal 28.11.2008, 18:00
Цитата(MisterCleric @  28.11.2008,  17:53 Найти цитируемый пост)
можем только серриализуемы объекты и простые типы

помоему при попытке передеть не Serializable сразу вылетает ошибка.
Еще не рекомендуется EJB работать с файловой системой на-прямую (так вроде в спеке написано), 
надо через JNDI (для этого посмотрите Java Naming and Directory Interface™ (JNDI) File System Service Provider)

Автор: polosatij 28.11.2008, 18:06
Цитата(MisterCleric @  28.11.2008,  17:53 Найти цитируемый пост)
Да и разве это бизнес-объект (InputStream), с какими и должны работать бизнес-методы? 


да.. это бизнес объект в xml виде, но очень большой..


Asal, 

ок, пасиба.. надо посмотреть..  smile 

Автор: MisterCleric 28.11.2008, 18:23
Если это xml то тебе нужен сервис, который и работает с xml-лями.
А вообще у меня есть тоже такая задача, но пока обратная. Надо получить объекты с базы, запаковать их в xml и отправить по FTP.
Я для этих целей юзаю JAXB. Посмотри, мож тебе подойдет. У него также есть возможность из xml сделать java-объекты. Возможно тебе как раз это и надо.

Автор: polosatij 28.11.2008, 18:32
Цитата(MisterCleric @  28.11.2008,  18:23 Найти цитируемый пост)
Если это xml то тебе нужен сервис, который и работает с xml-лями.
А вообще у меня есть тоже такая задача, но пока обратная. Надо получить объекты с базы, запаковать их в xml и отправить по FTP.
Я для этих целей юзаю JAXB. Посмотри, мож тебе подойдет. У него также есть возможность из xml сделать java-объекты. Возможно тебе как раз это и надо. 


нет.. спАсибА, мне это не надА  smile мне нужен InputStream для Stax parser-a в EJB  smile 

// пс: читаю: File System Service Provider, 1.2 Beta 3  smile 

Автор: MisterCleric 28.11.2008, 18:44
дык, может вынести данную логику с EJB? 
Вообще, я так вкратце посмотрел на интродакшн Stax, то типа можно стрим получить по урлу, ну и в принципе с любого места в сети или инэте. Т.е. можно и в бизнес-методе это сделать, если он все логику в себе заинкапсулирует, т.е. получение стрима, парсинг и т.д.
Тебе нужен именно URL, а не path, что бы не привязываться к операционке

Автор: powerOn 28.11.2008, 18:50
Цитата(MisterCleric @  28.11.2008,  17:53 Найти цитируемый пост)
От сюда делаем выводы: передать в методы бина мы можем только серриализуемы объекты и простые типы. 


Не только. Сериализуемые параметры нужно передовать если работа идет через Remote интерфейс, через локальный интерфейс можно передавать объекты по ссылке.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)