FinalConstruct() и подключение к LDAP серверу
От: DMA  
Дата: 12.01.03 12:47
Оценка:
Есть схема:
клиент->Service.exe(ATL)->LDAPкомпонент(ATL)-> LDAP Server.
Сервис создает объект LDAP и через него получает данные от LDAP сервера.
Раньше было реализовано так:
Сервис при получени запроса от клиента:

HRESULT ConnectionStatus;
    CComPtr<ILDAP> pLDAP;
    pLDAP.CoCreateInstance(CLSID_LDAP);
    ConnectionStatus=pLDAP->Connect(HostName , port );
    if ( ConnectionStatus == S_FALSE ) 
         goto errLabel;
    pLDAP->GetData(user);

Сервис из конфигурационной хмлки получает имя хоста(HostName) и Номер порта(port).
Метод Сonnect — просто открытие коннекта к LDAP серверу: LDAPConnection=ldap_open(server,port);
Соответственно LDAPConnection объявлена private в кслассе CLDAP.
Соответственно FinalRelease LDAP компонета имеет вид:

void FinalRelease()
    {
        m_pUnkMarshaler.Release();
        if ( LDAPConnection != NULL )
            ldap_unbind( LDAPConnection );
    }

Тут проблем никаких — при уничтожении объекта убивается коннект с сервером.
Сервер один, т.е. все клиенты коннектятся к одному и тому же серверу.
Встала задача сделать коннект в FinalConstruct, так как метод Connect по сути для одного объекта вызывается один раз только для того чтобы подрубится к серверу.
Все это для организации пула на много коннектов. Чтобы мы могли только при переключении объектов только вызывать нужные методы а не конектиться/дисконектиться заново.
Так вот все никак не получается это нормально сделать (
Кроме тупого варианта писать в сервисе имя сервера и порт в реестр и потом оттуда извлекать их из реестра. В компоненте читать xmlку нельзя!!!

HRESULT FinalConstruct()    {
//            m_ldapConnection = ldap_open("LDAPServer", 3128);
//        m_ldapConnection = ldap_open(Server, ServerPort);
        if ( m_ldapConnection == NULL ) return S_FALSE;    
    return CoCreateFreeThreadedMarshaler(
            GetControllingUnknown(), &m_pUnkMarshaler.p);
    }

Жду советов...
Re: FinalConstruct() и подключение к LDAP серверу
От: Tom Россия http://www.RSDN.ru
Дата: 12.01.03 13:07
Оценка:
Здравствуйте, DMA, Вы писали:

DMA>Есть схема:

клиент->>Service.exe(ATL)->LDAPкомпонент(ATL)-> LDAP Server.
DMA>Сервис создает объект LDAP и через него получает данные от LDAP сервера.
DMA>Раньше было реализовано так:
DMA>Сервис при получени запроса от клиента:

DMA>
DMA>HRESULT ConnectionStatus;
DMA>    CComPtr<ILDAP> pLDAP;
DMA>    pLDAP.CoCreateInstance(CLSID_LDAP);
DMA>    ConnectionStatus=pLDAP->Connect(HostName , port );
DMA>    if ( ConnectionStatus == S_FALSE ) 
DMA>         goto errLabel;
DMA>    pLDAP->GetData(user);    
DMA>

DMA>Сервис из конфигурационной хмлки получает имя хоста(HostName) и Номер порта(port).
DMA>Метод Сonnect — просто открытие коннекта к LDAP серверу: LDAPConnection=ldap_open(server,port);
DMA>Соответственно LDAPConnection объявлена private в кслассе CLDAP.
DMA>Соответственно FinalRelease LDAP компонета имеет вид:

DMA>
DMA>void FinalRelease()
DMA>    {
DMA>        m_pUnkMarshaler.Release();
DMA>        if ( LDAPConnection != NULL )
DMA>            ldap_unbind( LDAPConnection );
DMA>    }
DMA>

DMA>Тут проблем никаких — при уничтожении объекта убивается коннект с сервером.
DMA>Сервер один, т.е. все клиенты коннектятся к одному и тому же серверу.
DMA>Встала задача сделать коннект в FinalConstruct, так как метод Connect по сути для одного объекта вызывается один раз только для того чтобы подрубится к серверу.
DMA>Все это для организации пула на много коннектов. Чтобы мы могли только при переключении объектов только вызывать нужные методы а не конектиться/дисконектиться заново.
DMA>Так вот все никак не получается это нормально сделать (
DMA>Кроме тупого варианта писать в сервисе имя сервера и порт в реестр и потом оттуда извлекать их из реестра. В компоненте читать xmlку нельзя!!!

DMA>
DMA>HRESULT FinalConstruct()    {
DMA>//            m_ldapConnection = ldap_open("LDAPServer", 3128);
DMA>//        m_ldapConnection = ldap_open(Server, ServerPort);
DMA>        if ( m_ldapConnection == NULL ) return S_FALSE;    
DMA>    return CoCreateFreeThreadedMarshaler(
DMA>            GetControllingUnknown(), &m_pUnkMarshaler.p);
DMA>    }
DMA>

DMA>Жду советов...

По моему у тебя всё было правильно и делать конект в FinalConstruct не правильно в принципе. Вопрос в том каким образом ты собираешься организовать пул обьектов. Допустим такую архитектуру:

1. При запуске сервера он создаёт X кол-во обьектов LDAPConnection, но не соединяясь с сервером.
2. Клиент создаёт обьект LDAP. Компонент берёт из пула коннекшинов первый свободный и вызывает connect. Далее коннекшн проверяет если он уже подключён, то ничего не делает иначе подключается к серверу.
3. Клиент работает с компонентом
4. Клиент релизит компонент, при этом в FinalRelease обьект LDAPConnection не разрушается и не разрывает соединение с сервером, а просто возвращает его в пул.
5. Так же в пул можно возвращать обьект LDAPConnection по таймауту.
6. Сервер останавливается или происходит таймаут на подключение — разрывается соединение с сервером всех или определённого LDAPConnection соответственно.
Народная мудрось
всем все никому ничего(с).
Re[2]: FinalConstruct() и подключение к LDAP серверу
От: DMA  
Дата: 12.01.03 16:08
Оценка:
Здравствуйте, Tom, Вы писали:

Tom>По моему у тебя всё было правильно и делать конект в FinalConstruct не правильно в принципе. Вопрос в том каким образом ты собираешься организовать пул обьектов. Допустим такую архитектуру:


Tom>1. При запуске сервера он создаёт X кол-во обьектов LDAPConnection, но не соединяясь с сервером.

Tom>2. Клиент создаёт обьект LDAP. Компонент берёт из пула коннекшинов первый свободный и вызывает connect. Далее коннекшн проверяет если он уже подключён, то ничего не делает иначе подключается к серверу.
Tom>3. Клиент работает с компонентом
Tom>4. Клиент релизит компонент, при этом в FinalRelease обьект LDAPConnection не разрушается и не разрывает соединение с сервером, а просто возвращает его в пул.
Tom>5. Так же в пул можно возвращать обьект LDAPConnection по таймауту.
Tom>6. Сервер останавливается или происходит таймаут на подключение — разрывается соединение с сервером всех или определённого LDAPConnection соответственно.

Та архитектура, с которой я сейчас работаю:
1) К сервису приходят запросы.
2)Отвечая на запрос клиента, он создает объект LDAP. Через методы интерфейса ILDAP этого объекта работает с LDAP сервером.
Компонет LDAP допускает размещение объектов в пуле, для этого он реализовывает интерфейс IObjectControl.
Компонент LDAP соответственно помечен у меня как работающий в многопоточном апартаменте.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.