powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Вопрос по POST_EVENT
25 сообщений из 147, страница 2 из 6
Вопрос по POST_EVENT
    #33087668
fynda
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Strannic
ну что так сразу о печальном.

Почему о печальном-то? Печально было б если б выбора не было. А вариант с таблицей, в которую лог складывается и cron'ом раз в пять минут отсылается - тут уже предлагали, он вполне работоспособный и в случае временной неработоспособности сервера.

Strannic
да об этом я как то не подумал, но.... превое - письмо рано или поздно все равно дойдет до адресата,


Сомневаюсь я... При неработающем сервере-то... Скорее всего придется тебе опять же неотправленные письма в стопочку складывать и перепосылать через какое-то время. Те же... то есть тот же лог, только вид сбоку. :(

Strannicвторое - сделаю проверку на при возврате письма.


А кто его вернет-то? Напоминаю: сервер сдох. ;)
...
Рейтинг: 0 / 0
Вопрос по POST_EVENT
    #33087792
Strannic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
fynda Strannicвторое - сделаю проверку на при возврате письма.


А кто его вернет-то? Напоминаю: сервер сдох. ;)
Последний сервак до которого оно дошло вернет его с сообщением что дескать искомы сервер не найден.
...
Рейтинг: 0 / 0
Вопрос по POST_EVENT
    #33090074
FreemanZAV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
to batis
Я болею, завтра наверное поправлюсь и, если хочешь, опишу решение данной проблемы.
...
Рейтинг: 0 / 0
Вопрос по POST_EVENT
    #33090190
Фотография mv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну, вот вариант решения. Заводим специальную Log - таблицу. Вот с такой, к примеру, структурой:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
Create table Log (
 Moment     TimeStamp;
 Operation   Varchar( 10 );
 Connect_id Integer;
 TableName Varchar( 50 );
 Rec_Id Integer
)

В момент коннекта к базе получем с сервака текущее значение времени. Запоминаем в
Код: plaintext
 LastMoment : TDateTime. 

При изменени данных триггерами пишем значение Moment (текущее значение времени), Operation (удаление/изменение/), Connect_id (идентификатор коннекта), Table_Name (Имя изменяемой таблички), Rec_Id (идентификатор измененной/добавленной/удаленной записи)

Вот, при получении эвента о том, что данные поменялись, лезем в эту табличку и выбираем все, что произошло после LastMoment, и, если не нужны данные по изменениям, сделанным тобой лично - то отбрасываем значения с Connect_id = твоему коннекту.

Берем с сервака текущее время, запоминаем. Интерпретируем полученные значения.

Смыть, повторить.

Kull Damned об этом и говорил, вроде.
...
Рейтинг: 0 / 0
Вопрос по POST_EVENT
    #33090218
Лебедкин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FreemanZAV
Я болею, завтра наверное поправлюсь и, если хочешь, опишу решение данной проблемы.
Опиши плиз и мне интересно.
На счет списка активных юзеров по твоей методике работаю - доволен.
События с параметрами когда то тоже пытался реализовать через UDF, там один недостаток - события валятся не дожидаясь окончания транзакци, а так работать можно.
...
Рейтинг: 0 / 0
Вопрос по POST_EVENT
    #33090266
Лебедкин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А насчет кастрирований там - лучше бы, перед тем как холодным оружием махать предложили бы тогда нормальное решение задачи:
Данные обновляются несколько раз в минуту, юзер должен видеть таблицу всегда со свежими обновлениями, причем нажимать постоянно на кнопочку для рефреша его заставлять ни как нельзя! Как здесь быть без рефрешей по событию?

ИМХО этим (рефрешами) заниматься вполне допустимо, нужно только прицип гранулярности соблюдать. (ограничевать максимальное количество рефрешей в единицу времени)
...
Рейтинг: 0 / 0
Вопрос по POST_EVENT
    #33090517
Amris Mirddin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЛебедкинА насчет кастрирований там - лучше бы, перед тем как холодным оружием махать предложили бы тогда нормальное решение задачи:


Имхо с кастрацией уже поздно. С родителем надо было разбирацца :)

Лебедкин
Данные обновляются несколько раз в минуту, юзер должен видеть таблицу всегда со свежими обновлениями


Лично мне незнакомы задачи, в которых это на самом деле нужно. Знакомо много народу, искренне уверенного что нужно, но объяснить зачем они не могут. Знакомы также люди, втискивающие в СУБД-приложения несвойственные этим приложениям функции.
...
Рейтинг: 0 / 0
Вопрос по POST_EVENT
    #33091052
Лебедкин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Amris MirddinЛично мне незнакомы задачи, в которых это на самом деле нужно. Знакомо много народу, искренне уверенного что нужно, но объяснить зачем они не могут. Знакомы также люди, втискивающие в СУБД-приложения несвойственные этим приложениям функции.

Ну возьми, для примера, хотя бы мою задачу:
Большой таксопарк. В минуту в БД записывается разными операторами до 10 заявок. Несколько диспетчеров, занимающихся распределением заявок на автомобили непрерывно должны видеть как поступающие заявки, так изменяющейся статус введенных заявок для того, не возникало конфликтов (или было минимальным), когда два диспетчера пытаются распределить одну и ту же заявку. Плюс так же оперативно нужно видеть изменяющийся по статусам (занят, свободен, не на линии) список автомобилей.

И я уверен подобных задач реального времени в жизни хватает.
...
Рейтинг: 0 / 0
Вопрос по POST_EVENT
    #33091088
Фотография Kull Damned
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЛебедкинИ я уверен подобных задач реального времени в жизни хватает.Я бы для такой штуки делал надстройку - сервер-паблишер, который умеет рассылать нужные мне "эвенты-записи" основываясь на постоянном рефреше (тикер от 3-х секунд - подбирать) парочки-тройки таблиц лога (посменно, чтобы можно было чистить в фоновом режиме) на серверной стороне. А на клиентской стороне приемник-стек. Примерно так.
...
Рейтинг: 0 / 0
Вопрос по POST_EVENT
    #33091218
Лентяй
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Лебедкин
Ну возьми, для примера, хотя бы мою задачу:
Большой таксопарк. В минуту в БД записывается разными операторами до 10 заявок. Несколько диспетчеров, занимающихся распределением заявок на автомобили непрерывно должны видеть как поступающие заявки, так изменяющейся статус введенных заявок для того, не возникало конфликтов (или было минимальным), когда два диспетчера пытаются распределить одну и ту же заявку. Плюс так же оперативно нужно видеть изменяющийся по статусам (занят, свободен, не на линии) список автомобилей.

И я уверен подобных задач реального времени в жизни хватает.

А я бы не так к решению задачи подходил. Работал бы через трехзвенку. Причем статус автомобилей держал бы в памяти и в базу бы не писал. Каким бы ни был таксопарк при нынешних объемах памяти все его а/м спокойно в память влезут. Так же поступил бы со списком активных заявок. То есть при поступлении новой записывал бы ее в базу, но и оставлял бы в памяти. И вот из памяти AppServer-a и делал бы Refresh состояния на клиентах не мучая-бы при этом сервер. При закрытии заявки соответственно записывал бы ее в базу и удалял из AppServer-a. Нотификацию организовать можно кучей вариантов, опять же не насилуя птичку...
...
Рейтинг: 0 / 0
Вопрос по POST_EVENT
    #33091278
Amris Mirddin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Лентяй[quot Лебедкин]
Ну возьми, для примера, хотя бы мою задачу:
Большой таксопарк. В минуту в БД записывается разными операторами до 10 заявок. Несколько диспетчеров, занимающихся распределением заявок на автомобили непрерывно должны видеть как поступающие заявки,


Гы, таки мой ТЛ в отличной форме даже в понедельник Так и знал, что задача именно эта. Тык вот, ему не нужно непрерывно видеть все поступающие заявки, ему нужно знать что они есть. И даже это не непрерывно, а только когда он (диспетчер) а) idle б) присутствует на рабочем месте. Т.е. евент должен сообщать только о факте появления в базе новых заявок. А уже диспетчер на осоновании этой информации должен самостоятельно инициировать себе рефреш набора именно в тот момент, когда он намерен взяться за новую заявку. И первое, что он должен сделать когда выберет себе строку для обслуживания - осуществить её пессимистическую блокировку и ещё раз отрефрешить именно эту строку персонально, ибо с тех пор, как он её пофетчил, её уже мог а) взять на обслуживание другой (для этого блокировка) и б) оное обслуживание даже вообще завершить (для этого рефреш). И по завершении обслуживания одной заявки безусловно перечитать весь набор, были там эвенты, не были... Насчёт состояния машин присоединяюсь к предыдущим ораторам.

2 Лентяй: помнишь ты меня спрашивал, зачем нужна возможность задавать транзакцию RefreshSQL персонально и управлять ей? Кроме того, что я тебе тогда сказал, ещё и этот случай - совпадение с транзакцией не SelectSQL, а ModifySQL. А бывает, что нужно то так, то этак - когда основной набор рефрешится не всегда целиком, а построчно тоже.
...
Рейтинг: 0 / 0
Вопрос по POST_EVENT
    #33091351
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
дык, я к словам Amris добавлю еще что - есть такая хрень, диаграмма состояний.
так вот уже из изложенного про таксопарк я вижу, что у диспетчера есть совершенно явная диаграмма состояний, или последовательность действий.
предполагаемое:

1. диспетчер обновляет набор для просмотра заявок.
2. выбирает заявку для обработки (возможно сообразуясь со списком находящихся в этом районе машин), БЛОКИРУЕТ ее от захвата другими диспетчерами.
3. начинает работать по заявке.
4. после обработки заявки возвращается к п.1.

то есть, нигде тут никаких постоянных рефрешей нет, они диспетчеру вообще на дух не нужны (как не нужны _другие_ заявки в момент обработки конкретной, например).
...
Рейтинг: 0 / 0
Вопрос по POST_EVENT
    #33091781
Лебедкин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Amris MirddinТык вот, ему не нужно непрерывно видеть все поступающие заявки, ему нужно знать что они есть. И даже это не непрерывно, а только когда он (диспетчер) а) idle б) присутствует на рабочем месте.
Ему нужно именно видеть все поступающие заявки, что бы выбрат ь из них ту, с которой он хочет работать.

Amris Mirddin
Т.е. евент должен сообщать только о факте появления в базе новых заявок. А уже диспетчер на осоновании этой информации должен самостоятельно инициировать себе рефреш набора именно в тот момент, когда он намерен взяться за новую заявку.
Так вот вам рефреш на основании эвента. Тока он может принять решение что он будет браться за новую заявку видя текущие заявки, так что рефреш надо делать каждый раз после изменения списка текущих заявок дабы показать ему актуальный список.

По поводу блокировок - базара нет. Согласен, так и делаем.

kdv
1. диспетчер обновляет набор для просмотра заявок.
2. выбирает заявку для обработки (возможно сообразуясь со списком находящихся в этом районе машин), БЛОКИРУЕТ ее от захвата другими диспетчерами.
3. начинает работать по заявке.
4. после обработки заявки возвращается к п.1.

то есть, нигде тут никаких постоянных рефрешей нет, они диспетчеру вообще на дух не нужны (как не нужны _другие_ заявки в момент обработки конкретной, например).
В момент обработки текущей, другие заявки не нужны - согласен.
Но в даной диаграмме: после пункта 4 постоянно надо выполнять пункт 1, пока не перейдем к 2 (т.е. не начнем работать по какой-либо заявке).

Лентяй
А я бы не так к решению задачи подходил. Работал бы через трехзвенку.

Именно в этом направлении я сейчас и работаю
...
Рейтинг: 0 / 0
Вопрос по POST_EVENT
    #33092162
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Но в даной диаграмме: после пункта 4 постоянно надо выполнять пункт 1

то есть, диспетчер сидит сложа руки, и тупо пялится в монитор?
Если новые заявки приходят редко, то достаточно сигнала, что появились новые заявки. Жмем кнопку - перечитываем.
Если новые заявки приходят часто, то у диспетчера на экране все будет просто мелькать.
...
Рейтинг: 0 / 0
Вопрос по POST_EVENT
    #33092215
FreemanZAV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
to Лебедкин
Рассказываю. Нужно 4 таблицы. В 1-й будет список активных пользователей
(подойдет USERS_CLIENT). Во 2-й список событий
Код: plaintext
1.
2.
3.
CREATE TABLE EVENT_LIST (
  EVENT_ID INTEGER,
  EVENT_NAME VARCAHAR( 30 )
)
В 3-й содержиться список "заинтересованных" в событиях пользователей
Код: plaintext
1.
2.
3.
4.
CREATE TABLE USERS_EVENTS (
  USERS_EVENTS_ID INTEGER,
  EVENT_ID INTEGER,
  USERS_CLIENT_ID INTEGER
)
Каждый клиент, который принимает событие делает вставку в эту таблицу
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
CREATE PROCEDURE INS_USERS_EVENTS (USERS_CLIENT_ID, 
EVENT_NAME VARCAHR( 30 )) 
AS 
BEGIN
   INSERT INTO USERS_EVENTS (EVENT_ID, USERS_CLIENT_ID )
     SELECT EVENT_ID, :USERS_CLIENT_ID FROM EVENT_LIST WHERE EVENT_NAME=:EVENT_NAME;

END 
4-я таблица, собственно содержит события
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
CREATE TABLE KEY_EVENTS (
  KEY_EVENTS_ID INTEGER,
   EVENT_ID INTEGER,
  USERS_CLIENT_ID INTEGER,
  KEY_ID INTEGER,
  TABLE_NAME VARCHAR( 30 ),
  UPDATE_ACTION INTEGER /*0-вставка, 1 - обновление, 2 - удаление*/
)

В USERS_CLIENTS сделаем триггер на удаление
Код: plaintext
DELETE FROM KEY_EVENTS WHERE USERS_CLIENT_ID=OLD.USERS_CLIENT_ID 
Пример.
Допустим есть таблица
Код: plaintext
1.
2.
3.
4.
CREATE TABLE CLIENTS(
  CLIENT_ID INTEGER,
  CLIENT_NAME VARCHAR( 255 )

) 
Триггер на удаление выглядит так:
Код: plaintext
1.
2.
3.
4.
5.
  SELECT EVENT_ID FROM EVENT_LIST WHERE EVENT_NAME = 'DEL_CLIENTS' INTO :EVENT_ID;
  INSERT INTO KEY_EVENTS (EVENT_ID, USERS_CLIENT_ID, KEY_ID,
  TABLE_NAME,  UPDATE_ACTION) SELECT EVENT_ID, USERS_CLIENT_ID,
 OLD.CLIENT_ID, 'CLIENTS',  2   FROM USERS_EVENTS E WHERE EVENT_ID=:EVENT_ID
 AND EXISTS (SELECT  1  FROM USERS_CLIENTS U WHERE U.USERS_CLIENT_ID=E.USERS_CLIENT_ID AND U.NOT_PID_EXIST= 0 );
POST_EVENT 'DEL_CLIENTS';
Далее может выбрать все это на клиента одновременно с удалением
Код: plaintext
1.
2.
3.
FOR SELECT KEY_EVENTS_ID, KEY_ID FROM KEY_EVENTS K WHERE K.USERS_CLIENT_ID =:USERS_CLIENT_ID INTO  :KEY_EVENTS_ID, :KEY_ID DO BEGIN
  DELETE FROM KEY_EVENTS WHERE KEY_EVENTS_ID=:KEY_EVENTS_ID;
  SUSPEND; 
END  
Вот такая схема. Матом не ругаться.
Основная проблема определить, жив-ли клиент, нуждающийся в событии. Если использовать USERS_CLIENT, то проблем нет. Кроме этого есть еще несколько способов это определить, но я че-то уже устал.
...
Рейтинг: 0 / 0
Вопрос по POST_EVENT
    #33092415
Лебедкин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdvто есть, диспетчер сидит сложа руки, и тупо пялится в монитор?

ну он мжет, например, чай пить :-) и время от времени, например раз в 10 сек поглядывать на монитор, при этом ни куда не нажимая
kdv
Если новые заявки приходят редко, то достаточно сигнала, что появились новые заявки. Жмем кнопку - перечитываем.
Если новые заявки приходят часто, то у диспетчера на экране все будет просто мелькать.
Ни чего подобного, мелькания даже не заметно. Просто в гриде вдруг появляется новая строка или существующая меняет иконку или цвет (статус)
...
Рейтинг: 0 / 0
Вопрос по POST_EVENT
    #33092446
Лебедкин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Лебедкин
Лентяй
А я бы не так к решению задачи подходил. Работал бы через трехзвенку.

Именно в этом направлении я сейчас и работаю
Но в этом случае уже вся информационная нагрузка будет на сервер приложений, а InterBase (или любая другая СУБД) будет просто хранилищем архивных данных. Это нормально, но вопрос то ставился про выполение задачи именно средствами IB

И что бы тут не говорили про кривое программирование, система на основе рефрешей по событиям реально работает (не без огрехов кончно, а где их нет?), а значит имеет право на жизнь
...
Рейтинг: 0 / 0
Вопрос по POST_EVENT
    #33092476
Фотография Sash*
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Лебедкин
Ни чего подобного, мелькания даже не заметно. Просто в гриде вдруг появляется новая строка или существующая меняет иконку или цвет (статус)
угу, сел пользователь - прицелился, ткнул дважды в запись - а она возми и поменяйся на другую
...
Рейтинг: 0 / 0
Вопрос по POST_EVENT
    #33092508
fynda
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Лебедкин
ну он мжет, например, чай пить :-) и время от времени, например раз в 10 сек поглядывать на монитор, при этом ни куда не нажимая


Можно обновлять грид по таймеру раз в N (N - настраиваемо) секунд. Сел пить чай - включил таймер, и пусть поглядывает себе. А вообще нефиг чаи расписать на рабочем месте! ;)

Лебедкин
Ни чего подобного, мелькания даже не заметно.

Не заметно или пока не заметно? ;)
...
Рейтинг: 0 / 0
Вопрос по POST_EVENT
    #33092548
Лебедкин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sash*угу, сел пользователь - прицелился, ткнул дважды в запись - а она возми и поменяйся на другую
Тоже не угадал (хотя в первых версиях у меня так было), клинтский датасет перед рефрешем запоминает номер позиции по айдишнику, а после рефреша на него же перескакивает. В результате создается впечатление что при исчезновении строки сверху все строки просто сдвигаются, вместе с прицелом.
...
Рейтинг: 0 / 0
Вопрос по POST_EVENT
    #33092574
Лебедкин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fyndaМожно обновлять грид по таймеру раз в N (N - настраиваемо) секунд. Сел пить чай - включил таймер, и пусть поглядывает себе. А вообще нефиг чаи расписать на рабочем месте! ;)
Тогда чем обновление по таймеру лучьше обновления по событитю?

fyndaНе заметно или пока не заметно? ;)
Уже два с половиной года не заметно
...
Рейтинг: 0 / 0
Вопрос по POST_EVENT
    #33092637
АВП
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да уж, всё это здорово, но вот если бы за Event-ом можно было бы <int > приклеить, то не нужно было бы городить такое как FreemanZAV. Многим, так или иначе приходится подобное выдумывать. Когда я спросил у уважаемых гуру-создателей, почему решили отказаться от возможности высылать эвенты с параметрами, то ответ был простой и главное информативный: "патамучто" :( Хотя есть ряд задач, где действительно проще выслать ID с параметром, чем городить внешние таблицы-логи, таблицы с событиями, таблицы с клиентами и т.д. мне бы эта штука очень даже подошла, хоть у меня нет никакого грида. просто нужно знать какая запись в таблице запись изменилась. Можно конечно udf написать, которая по отдельному порту по TCP пакетик высылает с ID записи и на триггер повесить, но это тоже изврат нехилый - отдельный коннект на такую штуку держать...
Короче, объясните мне, кто может, в чём я ошибаюсь и почему параметр в эвенте является вселенским злом?
...
Рейтинг: 0 / 0
Вопрос по POST_EVENT
    #33092654
FreemanZAV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
to АВП
Ну вот опять. Если миллион записей вставляем, куда складывать параметры до комита и в какой форме давать параметры клиенту.
...
Рейтинг: 0 / 0
Вопрос по POST_EVENT
    #33092683
fynda
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Лебедкин
Тогда чем обновление по таймеру лучьше обновления по событитю?


Смотря как часто eventы приходят. Если за эти N секунд, что юзер на экран не смотрит - их десяток наваливается, то перечитываться запрос реже будет. Если за N*10 - один event, то ничем, хуже даже. Просто изначально вопрос был "как тут без event'ов", ну я и выдал идею, _как_. А _надо ли_ - это отдельный вопрос. ;)

Лебедкин
fyndaНе заметно или пока не заметно? ;)
Уже два с половиной года не заметно

А, ну тогда конечно "работает - не трогай" :)
...
Рейтинг: 0 / 0
Вопрос по POST_EVENT
    #33092885
Фотография Sash*
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Лебедкин Sash*угу, сел пользователь - прицелился, ткнул дважды в запись - а она возми и поменяйся на другую
Тоже не угадал (хотя в первых версиях у меня так было), клинтский датасет перед рефрешем запоминает номер позиции по айдишнику, а после рефреша на него же перескакивает. В результате создается впечатление что при исчезновении строки сверху все строки просто сдвигаются, вместе с прицелом.
ну так это если он в кнопку редактировавать жмет, а если он дважды щелкает на третей сверху строке - то она еще как из под курсора может выскочить
...
Рейтинг: 0 / 0
25 сообщений из 147, страница 2 из 6
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Вопрос по POST_EVENT
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]