Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.06.22;
Скачать: CL | DM;

Вниз

TSimpeObjectBroker - как переключить клиента на другой сервер?   Найти похожие ветки 

 
tytus   (2007-11-14 11:35) [0]

Доброго дня всем.
Ситуация следующая. Запущено два сервера-приложений на разных компах. Как мне переключить клиента с одного сервера на другой?
Реализован callback для отправки клиенту сообщений с сервера. Вот допустим посылаю клиенту сообщение с именем сервера (имя компа в сети) и клиент должен отключиться от текущего сервера-приложений и законнектиццо на другом компе. Использую TSockectConnection + TSimpleObjectBroker.
В списке серверов брокера всего два итема (пока что...)
Как правильно отключать сервера в брокере.
Servers[i].Enabled:=false - не помогает.


 
Сергей М. ©   (2007-11-14 11:50) [1]


> не помогает


Чему не помогает ? Отключению или подключению клиента ?
И что вообще значит "не помогает" ?


 
tytus   (2007-11-14 13:24) [2]

>Сергей М. ©   (14.11.07 11:50) [1]
делаю так.
В обработчике сообщений от сервера (на клиенте) пишу:
Вначале отключаю клиента.
Connect1.Close;//Connect1 - TSocketConnection SOB1 - TSimpleObjectBroker
Затем в брокере делаю недоступными все Servers  кроме того, свойство ComputerName которого совпадает ст принятым в сообщении
with SOB1 do
for i:=0 to Servers.Count-1 do
 begin
   if UpperCase(Servers[i].ComputerName)<>ApperCase(ServerMessage)then
     Servers[i].Enabled:=false
   else
     Servers[i].Enabled:=true;
 end;
Вот и все. //ServerMessage - строка от сервера
Затем заново подключаюсь
Connect1.Open;
и ловлю "No Servers available" , хотя сервера запущены...
Ежели в DesignTime отключать сервера по одному - то все работает...


 
Сергей М. ©   (2007-11-14 13:32) [3]


> В обработчике сообщений от сервера .. отключаю клиента


Такая логика, мягко говоря, не есть гут.

В колбэке посылай асинхронно предопределенное сообщение осн.потоку, при обработке которого собссно и выполняй дисконнект/реконнект и прочие манипуляции с брокером.


 
tytus   (2007-11-14 13:43) [4]

>Сергей М. ©   (14.11.07 13:32) [3]
если я правильно понял - то так и делаю.
вот фрагмент модуля колбека:
const
 CLIENT_MESSAGE=WM_USER+144;

procedure TClientCallBack.ClSend(const AMessage: WideString);
var
 s:WideString;
begin
s:=AMessage;
PostMessage(MainFm.Handle,CLIENT_MESSAGE,WParam(PChar(s)),0);
end;
где MainForm - собственно главная форма .
а вот что в самой главной форме:
const
 CLIENT_MESSAGE=WM_USER+144;
private
procedure CLIENTMESSAGE(var Message:TMessage);message CLIENT_MESSAGE;
затем в implementattion пишу:
procedure TMainFm.CLIENTMESSAGE(var Message:TMessage);
...
begin
SrvClientMessage:=WideString(Message.WParam);
ну а далее Вы знаете....
Получается, что если не делать PostMessage, то сервер подвиснет на время обработки сообщения на клиенте, а так - вроде правильно, и сервер никого не ждет...


 
Сергей М. ©   (2007-11-14 13:46) [5]


> если не делать PostMessage


Кто сказал что не делать ? Делать ! Именно об этом и идет речь !


 
tytus   (2007-11-14 13:59) [6]

>Сергей М. ©   (14.11.07 13:46) [5]
Да так и делаю... мы немного отвлеклись от темы вопроса.
Короче, проведя експеременты, подводя итог, могу сказать след.:
кампанент - TSimpleObjectBroker - для ленивых.
Тоесть - кинул его на форму, прописал сервера - и забыл. В нем даже свойство LoadBalanced ужо установлено в True.
Кстати об сем свойстве. Когда оно тру, то простой Connect1.Open работает на ура. Ежели его установить в фальш, то простым перебором в цикле i:=0 to Servers.Count-1 if not Servers[i].HasFailed ... ничего не добьешся.
Конечно, свое назначение он оправдывает - при подключении соединяется с доступным сервером приложений. А мне нужно с одного сервака переключить клиентов на другой.... короче с брокером не разрулил, и
юзаю простой TStringlist и циклом в блоке try..except..end пытаюсь соединится с доступным сервером, устанавливая принудительно
Connect1.Host:=Serverslist[i]. Вот так.
Исче раз - о брокере - все выше сказанное ИМХО.
Возможно не асилил...


 
Сергей М. ©   (2007-11-14 14:10) [7]


> tytus   (14.11.07 13:59) [6]


Сырой он, TSimpleObjectBroker ..
Он и писался-то Борландом скорее как демо.

Проще не искать там глюки, а сделать своего наследника TCustomObjectBroker, где реализовать требуемую логику самостоятельно.


 
tytus   (2007-11-14 14:27) [8]

>Сергей М. ©   (14.11.07 14:10) [7]
ну вот, мои изыскания и заключения подтвердились.
Спасбо за участие в конференции.
Наследника делать не буду - потому как времени нету, нужно довести до ума трехзвенку...



Страницы: 1 вся ветка

Текущий архив: 2008.06.22;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.022 c
2-1211574528
Otz
2008-05-24 00:28
2008.06.22
Записи в DBGrid


15-1210520423
Alexey
2008-05-11 19:40
2008.06.22
Ошибка при запуске Delphi


15-1210756224
User1
2008-05-14 13:10
2008.06.22
Как программно выключить сервер ?


2-1211821514
DJ_UZer
2008-05-26 21:05
2008.06.22
Добавить ссылку в меню файла "отправить"


2-1212041779
Smile
2008-05-29 10:16
2008.06.22
TFooClass