![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
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.