Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

CORBA-клиент и EJB


asg ©   (2002-03-26 12:02:00) 

Прошу помощи!
Написал простой EJB-компонент (Stateless SessionBean), разместил его на сервере приложений (IAS).
Хочу создать CORBA-клиента на BC++ Builder 5.0, который бы имел доступ к EJB-компоненту.
Подскажите, пожалуйста, как это сделать (если это вообще возможно сделать).
При запуске программы на C++ с
CORBA::ORB_var orb = CORBA::ORB_init(__argc, __argv);
вываливается с "исключением".
И еще. В доке написано, что доступ к EJB-компоненту можно получить либо так:
CosNaming::NamingContext_var rootContext =
CosNaming::NamingContext::_narrow(orb->resolve_initial_references("NameService"));
либо так:
CosNamingExt::ExtendedNamingContextFactory_var factory =
   CosNamingExt::ExtendedNamingContextFactory::_bind("NameService");

Но в первом случае, нужно клиента запускать с параметром
-ORBInitRef NameService=iioploc://<host>:<port>/NameService

Так вот вопрос: Что это "NameService"? Имя какого сервиса? Моего EJB-компонента?


asg   (2002-04-15 10:16:00) [1]

Всем спасибо за советы. С SessionBean все получилось и работает.

Теперь у меня вопрос по EntityBean.

Предположим, в БД Interbase имеется таблица:
CREATE TABLE FILIAL (
      IDFILIAL      INTEGER                           NOT NULL,
      NAMEFILIAL    NAME                              NOT NULL,
          PRIMARY KEY (IDFILIAL));

CREATE UNIQUE INDEX XAK1FILIAL ON FILIAL (NAMEFILIAL);
CREATE UNIQUE INDEX XPKFILIAL ON FILIAL (IDFILIAL);

Причем, IDFILIAL генерируется при помощи триггера
CREATE TRIGGER ADDFILIAL FOR FILIAL
ACTIVE BEFORE INSERT POSITION 0
AS
BEGIN
   if (NEW.IDFilial is null) then
       NEW.IDFilial = gen_id (GenIDFilial, 1);
END

Далее. Имеется EntityBean:
public interface FilialHome extends EJBHome
{
 public Filial create(int idfilial, String namefilial) throws RemoteException, CreateException;
 public Filial create(String namefilial) throws RemoteException, CreateException;
 public Filial create(int idfilial) throws RemoteException, CreateException;
 public Filial findByPrimaryKey(int primaryKey) throws RemoteException, FinderException;
}

public abstract class FilialBean implements EntityBean
{
 EntityContext entityContext;
 public int ejbCreate(int idfilial, String namefilial) throws CreateException
 {
   setIdfilial(idfilial);
   setNamefilial(namefilial);
   return 0;
 }
 public int ejbCreate(int idfilial) throws CreateException
 {
   return ejbCreate(idfilial, null);
 }

 public int ejbCreate(String namefilial) throws CreateException
 {
 }
 public void ejbPostCreate(int idfilial, String namefilial) throws CreateException
 {
 }

 public void ejbPostCreate(String namefilial) throws CreateException
 {
 }

 public void ejbPostCreate(int idfilial) throws CreateException
 {
   ejbPostCreate(idfilial, null);
 }
 public void ejbRemove() throws RemoveException
 {
 }
 public void ejbActivate()
 {
 }
 public void ejbPassivate()
 {
 }
 public void ejbLoad()
 {
 }
 public void ejbStore()
 {
 }
 public void setEntityContext(EntityContext entityContext)
 {
   this.entityContext = entityContext;
 }
 public void unsetEntityContext()
 {
   entityContext = null;
 }
 public abstract int getIdfilial();
 public abstract void setIdfilial(int idfilial);
 public abstract String getNamefilial();
 public abstract void setNamefilial(String namefilial);
}

Когда клиент вызывает метод Create(id, name), то все работает хорошо.
А вот когда клиент вызывает метод Create(name), то возникает Exception.

Подскажите, плиз, как сделать так, чтобы объект создавался, но ID при этом генерировался сервером БД.


Сергей Орлик   (2002-04-02 20:03:00) [2]

Здравствуйте, Коллеги!

Действительно, из D, Kylix и CB есть возможность работать с EJB.

Первая - ручками :) с разными там factory с копанием в сумасшедшем idl, который по J2EE стандарту обеспечивает CORBA-mapping для EJB.

Вторая - по человечески - через ejb2sidl, т.е. SIDL - Simplified IDL (специфика Borland AppServer 4.x и Borland Enterprise Server AppServer Edition, т.е. 5.x).

Пример есть в поставке D6 в каталоге с CORBA-примерами \Demos\CORBA\idl2pas\EJB. В CB6 такого примера нет, но работает абсолютно также.

Мы действительно показывали это не раз на наших семинарах (в очередной раз это будет 9-го апреля -   http://www.softline.ru/seminar.asp?catalog_name=SoftLine&category_name=&product_id=Seminar-10005&view=seminarinvitation_ru)

Вообще говоря, эту тему лучше всех знает Александр Цимбал (автор "CORBA для профессиналов", кстати, какое-то время работал в команде VisiBroker). Он читает курсы по J2EE и CORBA, в том числе специализированные по тематике доступа к EJB из Non-Java приложений - его e-mail: tsimbal@bitechnology.ru .

С наилучшими пожеланиями,
Сергей Орлик
Borland


paul_shmakov   (2002-04-02 12:07:00) [3]

2 iZEN:
"...тогда можно будет обращаться из Win32-приложений к EJB"
я не готов сейчас ответить на этот вопрос (не помню как), но есть возможность обращаться к компонентам ejb через iiop. т.е. corba-клиент, написанный на delphi, например, вполне может обращаться к методам компонента ejb. что и покзывали на каком-то семинаре borland-а. по крайней мере, для visibroker и borland appserver это верно.


iZEN   (2002-04-01 19:29:00) [4]

Посмотрите примеры к C++ Builder, что-то должно же быть (по CORBA с VisiBroker, например).


iZEN   (2002-04-01 19:27:00) [5]

javax.naming.InitialContext -- это из Java Naming and Directory Interface (JNDI), J2EE. Для Windows можно провести аналогию с Active Directory, к которой может быть(?) можно найти JNDI Spi (Service Provider Interface) и тогда можно будет обращаться из Win32-приложений к EJB.

javax.rmi.PortableRemoteObject -- это из Java API Remote Method Invokation(RMI) поверх IIOP-протокола; часть есть в J2SE, полная реализация в J2EE.

Всего этого нет в C++ Builder'е, но Borland что-то обещает выпустить.

Скоро будут специфицированы EJB-коннекторы для других языков и CORBA.


asg   (2002-04-01 10:03:00) [6]

Доброе время суток всем!
Примерах, поставляемых с AppServer имеется такой код для поиска компонента:
javax.naming.Context context = new javax.naming.InitialContext();

   Object ref = context.lookup("java:comp/env/ejb/Sort");
   SortHome home = (SortHome) javax.rmi.PortableRemoteObject.narrow(ref, SortHome.class);

Каким образом можно тоже самое сделать из-под C++ Builder'a?
Можно ли использовать для этого CORBA и каким образом? (Желательно с примером)


asg   (2002-03-29 09:53:00) [7]

Спасибо большое за подсказку. Все получилось.
НО!!!!
Возникла следующая проблема.
При запуске клиента я должен указать порт, а значение порта при каждом запуске сервера приложений - разный.
Программу запускаю так:
Project1.exe -ORBInitRef NameService=iioploc://192.168.1.3:3692/NameService

Как сделать, чтобы можно было запустить клиента, указав только адрес сервера приложений, имя контейнера, в котором расположен компонент?

Помогите, кто может.


paul_shmakov   (2002-03-26 17:46:00) [8]

а orb запущен? если исключение прямо на ORB_init, то скорее всего orb просто не запущен.

кстати, лучше выбрать первый вариант, т.е.

CosNaming::NamingContext_var rootContext =
CosNaming::NamingContext::_narrow(orb->resolve_initial_references("NameService"));

т.к. второй использует метод bind, а он есть только в visibroker.

а строка "NameService" в том вызове - это имя стандартного сервиса, ссылку на который мы хотим получить. в данном случае - это сервис именования.


asg   (2002-03-26 13:09:00) [9]

А можно конкретнее. С примером. :)))
Компонент имеет Home-интерфейс DemoHome (Home Name - DemoEJB)размещен в ejbcontainer. Контейнер размещен в AppServer, который называется asg.

Вопрос:
1. Что нужно указывать в командной строке при вызове клиента?
2. Что такое "NameService" в следующей строке CosNamingExt::ExtendedNamingContextFactory_var factory =
  CosNamingExt::ExtendedNamingContextFactory::_bind ("NameService");

Программа на этой строке выдет "исключение".


Delph   (2002-03-26 12:20:00) [10]

NameService - сервис именования, который, если по простому сказать, содержит соответствия имен обьектов, зарегистрированных в сервисе именования их обьектным ссылкам. Вы должны получить ссылку на сервис именования, получить у него по имени ссылку на необходимый Home интерфейс бина, через вызов метода Create Home интерфейса создать экземпляр и получить ссылку на Remote(Component) интерфейс, а затем уже по ней вызывать методы бина... Если короче - смотрите доку дальше, за вызовом NameService.


Наверх

Титульная страница Поиск, карта сайта Написать письмо