Модераторы: LSD
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как в Oracle с сервера послать сообщение 
:(
    Опции темы
RoMka
Дата 21.9.2004, 19:33 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Подскажите как с сервера, на котором стоит Oracle, послать сообщение конкретному пользователю, на компьютер, где в данный момент активна его сессия. qstn.gif


sample.gif
  Вверх
LSD
Дата 21.9.2004, 19:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 18
Всего: 538



Оповещение по событию можно реализовать с помощью Advanced Queueing. Правда только через OCI интерфейс.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
RoMka
Дата 21.9.2004, 19:55 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











LSD, можно поподробнее? плиз

sample.gif
  Вверх
LSD
Дата 21.9.2004, 20:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 18
Всего: 538



В Oracle есть такая штука, как Advanced Queueing (очередь сообщений). Предназначенна для обмена сообщениями между пользователями.
Сообщение содержит в себе информацию о пользователе, времени отправки сообщения, приоритете и некоторые другие сведения. Ну и конечно данные, которые могут быть просто двоичными (RAW) или Oracle-овскими объектами. Очереди бываю persistent и not persistent.
Persistent это очереди с гарантарованной доставой сообщения, т.е. сообщение сохраняется в таблице и пользователь может его получить, даже если в момент отправки он был недоступен. Но недостатком является то, что пользователь сам вынужден опрашивать очередь на предмет наличия новых сообщений. Хотя тут тоже есть вариант: можно задать таймаут в течении которого, ждать прихода новых сообщений.
Not persistent это очереди без гарантированной доставки сообщений. Но они способны оповещать зарегистрированных пользователей, через callback, о том что пришло новое сообщение. Хотя, если на момент прихода сообщения, пользователь был недоступен, то собщение он не получит.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
RoMka
Дата 22.9.2004, 05:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 21.9.2004

Репутация: нет
Всего: нет



А в каком виде будет приходить сообщение?

sample.gif
PM MAIL ICQ   Вверх
LSD
Дата 22.9.2004, 18:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 18
Всего: 538



Цитата(RoMka @ 22.9.2004, 05:13)
А в каком виде будет приходить сообщение?

Для какой очереди?


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
RoMka
Дата 23.9.2004, 07:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 21.9.2004

Репутация: нет
Всего: нет



LSD Для "Not persistent " ?

sample.gif

PM MAIL ICQ   Вверх
LSD
Дата 24.9.2004, 23:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 18
Всего: 538



Я дико извиняюсь, но я забыл примерчик на работе. Так что теперь придется ждать до понедельника.
А в общем это выглядит так создается очередь. Вызывается функция регистрации подписчика, в которую в качестве аргумента передается указатель на функцию. Затем по приходу события будет вызванна данная функция, куда в качестве аргумента будут переданны параметры сообщения, в том числе и данные. Все это реализуется через OCI, вроде еще есть вариант через JMS, но я что-то его не нашел пока.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
LSD
Дата 28.9.2004, 09:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 18
Всего: 538



Вот этот примерчик.
Создание очереди:
Код

Rem ------------------------------------------------------
REM create queue table for persistent multiple consumers
Rem ------------------------------------------------------
connect pubsub/pubsub;
Rem  Create or replace a queue table
begin
 DBMS_AQADM.CREATE_QUEUE_TABLE(
 QUEUE_TABLE=>'pubsub.raw_msg_table',
 MULTIPLE_CONSUMERS => TRUE,
 QUEUE_PAYLOAD_TYPE =>'RAW',
 COMPATIBLE => '8.1.5');
end;
/
Rem ------------------------------------------------------
Rem  Create a persistent queue for publishing messages
Rem ------------------------------------------------------
Rem  Create a queue for logon events
begin
 DBMS_AQADM.CREATE_QUEUE(QUEUE_NAME=>'pubsub.logon',
 QUEUE_TABLE=>'pubsub.raw_msg_table',
 COMMENT=>'Q for error triggers');
end;
/
Rem ------------------------------------------------------
Rem  Start the queue
Rem ------------------------------------------------------
begin
 DBMS_AQADM.START_QUEUE('pubsub.logon');
end;
/
Rem ------------------------------------------------------
Rem  define new_enqueue for convenience
Rem ------------------------------------------------------
create or replace procedure new_enqueue(queue_name  in varchar2,
                                       payload  in raw ,
correlation in varchar2 := NULL,
exception_queue in varchar2 := NULL)
as
 enq_ct     dbms_aq.enqueue_options_t;
 msg_prop   dbms_aq.message_properties_t;
 enq_msgid  raw(16);
 userdata   raw(1000);
begin
 msg_prop.exception_queue := exception_queue;
 msg_prop.correlation := correlation;
 userdata := payload;
 DBMS_AQ.ENQUEUE(queue_name,enq_ct, msg_prop,userdata,enq_msgid);
end;
/
Rem ------------------------------------------------------
Rem  add subscriber with rule based on current user name,
Rem  using correlation_id
Rem ------------------------------------------------------
declare
subscriber sys.aq$_agent;
begin
 subscriber := sys.aq$_agent('SNOOP', null, null);
 dbms_aqadm.add_subscriber(queue_name => 'pubsub.logon',
                           subscriber => subscriber,
                           rule => 'CORRID = ''SCOTT'' ');
end;
/
Rem ------------------------------------------------------
Rem  create a trigger on logon on database
Rem ------------------------------------------------------
Rem  create trigger on after logon
create or replace trigger systrig2
  AFTER LOGON
  ON DATABASE
  begin
    new_enqueue('pubsub.logon', hextoraw('9999'), dbms_standard.login_user);
  end;
/

Код программы:
Код

ub4 namespace = OCI_SUBSCR_NAMESPACE_AQ;
/* callback function for notification of logon of user 'scott' on database */
ub4 notifySnoop(ctx, subscrhp, pay, payl, desc, mode)
   dvoid *ctx;
   OCISubscription *subscrhp;
   dvoid *pay;
   ub4 payl;
   dvoid *desc;
   ub4 mode;
{
   printf("Notification : User Scott Logged on\n");
}
int main()
{
   OCISession *authp = (OCISession *) 0;
   OCISubscription *subscrhpSnoop = (OCISubscription *)0;

/*****************************************************
Initialize OCI Process/Environment
Initialize Server Contexts
Connect to Server
Set Service Context
******************************************************/
   /* Registration Code Begins */
/* Each call to initSubscriptionHn allocates
          and Initialises a Registration Handle */
   initSubscriptionHn(    &subscrhpSnoop,    /* subscription handle */
       "PUBSUB.SNOOP:ADMIN", /* subscription name */
/* <queue_name>:<agent_name> */
       (dvoid*)notifySnoop); /* callback function */

/*****************************************************
The Client Process does not need a live Session for Callbacks
End Session and Detach from Server
******************************************************/
   OCISessionEnd ( svchp,  errhp, authp, (ub4) OCI_DEFAULT);
   /* detach from server */
   OCIServerDetach( srvhp, errhp, OCI_DEFAULT);
   while (1)     /* wait for callback */
       sleep(1);
}
void initSubscriptionHn (subscrhp,
                        subscriptionName,
                        func)
OCISubscription **subscrhp;
 char* subscriptionName;
 dvoid * func;
{
   /* allocate subscription handle */
   (void) OCIHandleAlloc((dvoid *) envhp, (dvoid **)subscrhp,
       (ub4) OCI_HTYPE_SUBSCRIPTION,
       (size_t) 0, (dvoid **) 0);

   /* set subscription name in handle */
   (void) OCIAttrSet((dvoid *) *subscrhp, (ub4) OCI_HTYPE_SUBSCRIPTION,
       (dvoid *) subscriptionName,
       (ub4) strlen((char *)subscriptionName),
       (ub4) OCI_ATTR_SUBSCR_NAME, errhp);

   /* set callback function in handle */
   (void) OCIAttrSet((dvoid *) *subscrhp, (ub4) OCI_HTYPE_SUBSCRIPTION,
       (dvoid *) func, (ub4) 0,
       (ub4) OCI_ATTR_SUBSCR_CALLBACK, errhp);
   (void) OCIAttrSet((dvoid *) *subscrhp, (ub4) OCI_HTYPE_SUBSCRIPTION,
       (dvoid *) 0, (ub4) 0,
       (ub4) OCI_ATTR_SUBSCR_CTX, errhp);

   /* set namespace in handle */
   (void) OCIAttrSet((dvoid *) *subscrhp, (ub4) OCI_HTYPE_SUBSCRIPTION,
       (dvoid *) &namespace, (ub4) 0,
       (ub4) OCI_ATTR_SUBSCR_NAMESPACE, errhp);
   checkerr(errhp, OCISubscriptionRegister(svchp, subscrhp, 1, errhp,
       OCI_DEFAULT));
}



--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Oracle"
Zloxa
LSD

Данный раздел предназначен для обсуждения проблем с Oracle Database, другие продукты Oracle здесь не обсуждаются. Просьба при создании темы, придерживаться следующих правил:

  • при создании темы давайте ей осмысленное название, описывающее суть проблемы
  • указывайте используемую версию базы, способ соединения и язык программирования
  • при ошибках обязательно приводите код ошибки и сообщение сервера
  • приводите код в котором возникла ошибка, по возможности дайте тестовый пример демонстрирующий ошибку
  • при вставке кода используйте соответсвующие теги: [code=sql] [/code] для подсветки SQL и PL/SQL кода, [code=java] [/code] - для Java, и т.д.

  • документация по Oracle: 9i, 10g, 11g
  • книги по Oracle можно поискать здесь
  • действия модераторов можно обсудить здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Zloxa, LSD.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Oracle | Следующая тема »


 




[ Время генерации скрипта: 0.0513 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.