Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 DBMS_PIPE  [new]
VicZai
Member

Откуда:
Сообщений: 613
Не могу понять такую вещь

Задача такова, надо n клиентам слать сообщения из разных процедур. Сделал тригер на открытие базы в котором создается публичный канал. Далее в него пишутся сообщения.

Вот тут и не понятно. Делаем эксперимент в одном плюсе пишем, в другом ждем и читаем. Все прекрасно работает. Теперь подключаем третий. В первом пишем, а вот читаем только в том, который законектился первым, а второй продолжает ждать.

Вот такой код на отправку
BEGIN
pkg_monitoring.send_messg ('YYYYYYYYYYYYYYYYYYYYYY', 'PMONITOR');
END;

Процедура

PROCEDURE SEND_MESSG(MESSG_IN IN VARCHAR2, PIPENAME_IN IN VARCHAR2) AS
CALL_STATUS NUMBER;
ERROR_SEND EXCEPTION;
BEGIN
DBMS_PIPE.PACK_MESSAGE(MESSG_IN);
CALL_STATUS := DBMS_PIPE.SEND_MESSAGE(PIPENAME => PIPENAME_IN,
TIMEOUT => 0);
IF CALL_STATUS != 0 THEN
RAISE ERROR_SEND;
END IF;
EXCEPTION
WHEN ERROR_SEND THEN
RAISE_APPLICATION_ERROR(-20000, 'Fail!');
WHEN OTHERS THEN
RAISE;
END SEND_MESSG;

Вот так читаем

DECLARE
mymessg VARCHAR2 (10000);
errnum NUMBER;
BEGIN
eacnew.pkg_monitoring.receive_messg (mymessg, errnum);
DBMS_OUTPUT.put_line (mymessg);
END;

Соответственно прцедура чтения

PROCEDURE RECEIVE_MESSG(REQUEST_OUT OUT VARCHAR2,
RETURN_CODE_OUT OUT NUMBER) IS

TEMP_RETURN_CODE NUMBER;
BEGIN
TEMP_RETURN_CODE := DBMS_PIPE.RECEIVE_MESSAGE(PIPENAME => 'PMONITOR');

DBMS_PIPE.UNPACK_MESSAGE(REQUEST_OUT);

RETURN_CODE_OUT := TEMP_RETURN_CODE;
EXCEPTION
WHEN OTHERS THEN
RAISE;
END RECEIVE_MESSG;

Что не так, не пойму
16 июн 06, 10:19    [2777863]     Ответить | Цитировать Сообщить модератору
 Re: DBMS_PIPE  [new]
DEBugger13
Member

Откуда:
Сообщений: 34
Для DBMS_ALERT- если оповещение ожидается несколькими сеансами, сообщение получит каждый из них.
А при работе с программными каналами DBMS_PIPE сообщение получит только один из них, причем неизвестно какой именно.
16 июн 06, 10:36    [2777948]     Ответить | Цитировать Сообщить модератору
 Re: DBMS_PIPE  [new]
Elic
Member

Откуда:
Сообщений: 29979
VicZai
надо n клиентам слать сообщения из разных процедур.
Что не так, не пойму
RTFM Writing and Reading Pipes (FAQ)
А dbms_alert поддерживает N клиентов, но не поддерживает N сообщений.
16 июн 06, 10:37    [2777954]     Ответить | Цитировать Сообщить модератору
 Re: DBMS_PIPE  [new]
VicZai
Member

Откуда:
Сообщений: 613
алерты транзакционно зависимы и есть проблемы передачи нескольких сигналов из разных сессий.
16 июн 06, 10:44    [2778015]     Ответить | Цитировать Сообщить модератору
 Re: DBMS_PIPE  [new]
VicZai
Member

Откуда:
Сообщений: 613
Получается что неззя так сделать? Похоже что нужно открывать канал для каждого пользователя который хочет получать сообщения.
16 июн 06, 10:54    [2778103]     Ответить | Цитировать Сообщить модератору
 Re: DBMS_PIPE  [new]
mcureenab
Member

Откуда: Murmansk
Сообщений: 5928
VicZai
алерты транзакционно зависимы и есть проблемы передачи нескольких сигналов из разных сессий.


Так отправляй сигнал из автономной транзакции, делов то куча.

Возможно тебе стоит посмотреть на Advanced Queuing.
16 июн 06, 11:31    [2778446]     Ответить | Цитировать Сообщить модератору
 Re: DBMS_PIPE  [new]
mcureenab
Member

Откуда: Murmansk
Сообщений: 5928
VicZai
Получается что неззя так сделать? Похоже что нужно открывать канал для каждого пользователя который хочет получать сообщения.


Или сделать мультеплексор - асинхронную процедуру, которая будет читать один канал, и тиражировать сообщение всем заинтересованным процессам через каналы или ещё как нибудь.
16 июн 06, 11:34    [2778480]     Ответить | Цитировать Сообщить модератору
 Re: DBMS_PIPE  [new]
VicZai
Member

Откуда:
Сообщений: 613
Пойдем по такому пути

Каждый подписчик создает свой канал, а потом из него же и читает. А источники сообщений будут писать во все доступные каналы
16 июн 06, 11:44    [2778545]     Ответить | Цитировать Сообщить модератору
 Re: DBMS_PIPE  [new]
Fucker
Member [заблокирован]

Откуда:
Сообщений: 1525
VicZai
Пойдем по такому пути

Каждый подписчик создает свой канал, а потом из него же и читает. А источники сообщений будут писать во все доступные каналы
Не майтесь х...ей...

Тебе уже посоветовали:
mcureenab
на Advanced Queuing.


Fucker
16 июн 06, 14:14    [2779754]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить