DataSnap XE додавання 1, Різне, Програмування, статті

Один поважний чоловік пропрацював навчальний приклад по зворотним викликам (callbacks) та ініціював його модифікацію на тему “чистий callback з боку сервера”.


Любителям відразу отримати по-повній рекомендується завантажити нафарширований фичами приклад з центрального сховища. Завантажувати його треба безпосередньо з Delphi IDE способом, описаному в згаданому вище уроці.


Але мені, як колишньому (?) Delphi-тренеру більш до душі поетапне знайомство, коли ти не копіпаст чужі напрацювання, а саме символ за символом забиваєш код в середу (і мозок). Тому давайте по-тихому (хто ще не зробив) все-таки виконаємо приклад на зворотні виклики і також повільно навчимо сервер самостійно вести мовлення в повністю асинхронному режимі (для чого якраз і потрібні heavy-weight callbacks).


Постановка завдання (не моя): таймер на сервері, який сповіщає клієнтів викликом клієнтського методу (що і є callback).


У ранньому DataSnap щось якось було складно з тим, щоб навантажити серверний додаток інтерфейсними елементами. Зараз з цим просто: додаємо на серверну форму компонент TButton і запланований TTimer. Кнопка – щоб запустити таймер з цілком тривіальним кодом:


Timer1.Enabled := not Timer1.Enabled; / / в design-time таймер Enabled = fasle


На подію таймера напишемо теж щось просте, але ємне:


ServerContainer1.DSServer1.BroadcastMessage(
“DelphiLabsChannel”, / / ​​назва каналу, куди буде мовлення
TJSONString.Create (“This is a message, triggered by timer”) / / посилаємо в форматі JSON
)


Тоді при запущеному сервері і клієнті (саме в такій послідовності) натискання на кнопку пустить таймер, таймер через умолчательную секунду зробить broadcast по клієнтам, підключеним до зазначеного каналу (Перший параметр).


Де на клієнті пошукати назва каналу?


 

де шукати ChannelName (ім’я каналу)


Вибираємо компонент (вже обраний на малюнку) і шукаємо в інспектора об’єктів.


А як повідомити серверу, “в якій” канал потрібно вести мовлення? Можна, звичайно, викликати спеціально створений метод на сервері, змусивши сервер запам’ятати це ім’я. Якщо ви будете запам’ятовувати назву каналу в якомусь поле класу серверних методів, то пам’ятайте, що LifeCycle об’єктів буває різний (матеріал уроку про життєві цикли).


Але забудемо про життєві цикли і не будемо взагалі думати про повідомлення серверу назву каналу. Подумаємо про те, що, ймовірно, доцільно спочатку спроектувати систему обміну повідомленнями між клієнтами і сервером на базі системи каналів мовлення. Що-небудь легке типу:



  1. Канал оповіщення про блокування
  2. Канал оповіщення про критичну завантаження сервера
  3. Канал повідомлень про примусові оновлення
  4. Канал повідомлень про бажані оновлення
  5. Чат-канал

… В такому випадку назви каналів уже жорстко прошиті і нічого повідомляти не треба. Взагалі, приємно, що в новій DataSnap XE все зберігається в рядках: ChannelName, CallbackName, ClientName.


(Прошу прощення за зайву подробиця – інстинкт тренера :))


Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*