Есть схема:
клиент->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);
}
Жду советов...
Здравствуйте, 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 соответственно.