![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
TSimpeObjectBroker - как переключить клиента на другой сервер? [D7, WinXP]
tytus © (2007-11-14 11:35:00)Доброго дня всем.
Ситуация следующая. Запущено два сервера-приложений на разных компах. Как мне переключить клиента с одного сервера на другой?
Реализован callback для отправки клиенту сообщений с сервера. Вот допустим посылаю клиенту сообщение с именем сервера (имя компа в сети) и клиент должен отключиться от текущего сервера-приложений и законнектиццо на другом компе. Использую TSockectConnection + TSimpleObjectBroker.
В списке серверов брокера всего два итема (пока что...)
Как правильно отключать сервера в брокере.
Servers[i].Enabled:=false - не помогает.
tytus (2007-11-14 14:27:00) [1]>Сергей М. © (14.11.07 14:10) [7]
ну вот, мои изыскания и заключения подтвердились.
Спасбо за участие в конференции.
Наследника делать не буду - потому как времени нету, нужно довести до ума трехзвенку...
Сергей М. (2007-11-14 14:10:00) [2]
> tytus (14.11.07 13:59) [6]
Сырой он, TSimpleObjectBroker ..
Он и писался-то Борландом скорее как демо.
Проще не искать там глюки, а сделать своего наследника TCustomObjectBroker, где реализовать требуемую логику самостоятельно.
tytus (2007-11-14 13:59:00) [3]>Сергей М. © (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 13:46:00) [4]
> если не делать PostMessage
Кто сказал что не делать ? Делать ! Именно об этом и идет речь !
tytus (2007-11-14 13:43:00) [5]>Сергей М. © (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:32:00) [6]
> В обработчике сообщений от сервера .. отключаю клиента
Такая логика, мягко говоря, не есть гут.
В колбэке посылай асинхронно предопределенное сообщение осн.потоку, при обработке которого собссно и выполняй дисконнект/реконнект и прочие манипуляции с брокером.
tytus (2007-11-14 13:24:00) [7]>Сергей М. © (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 11:50:00) [8]
> не помогает
Чемуне помогает ? Отключению или подключению клиента ?
И что вообще значит "не помогает" ?