Текущий архив: 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.46 MB
Время: 0.033 c