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

Откуда:
Сообщений: 95
Необходимо данные из очереди сообщений одной схемы перенести в очередь на другой.
Очередь должна быть с приоритетом.
Создаю в первой схеме, тип:
create or replace type EX_TYPE as object
(
 task_id			number,
 schema_name		varchar2(30),
 block			varchar2(4000),
 priority			number
)
таблицу очереди:
begin
  sys.dbms_aqadm.create_queue_table(
    queue_table => 'EX_QT',
    queue_payload_type => EX_TYPE',
    sort_list => 'PRIORITY',
    multiple_consumers => true);
end;
очередь:
begin
  sys.dbms_aqadm.create_queue(
    queue_name => 'EX_Q',
    queue_table => 'EX_QT',
    queue_type => sys.dbms_aqadm.normal_queue);
end;
Запускаю:
BEGIN
  dbms_aqadm.start_queue('EX_Q', TRUE, TRUE);
END;
Создаю подписчика:
DECLARE 
subscriber sys.aq$_agent;
BEGIN
subscriber := sys.aq$_agent('Test2',				'Test2.ex_q@bubu.du',
	null);
dbms_aqadm.add_subscriber(queue_name => 'ex_q',
subscriber => subscriber);
dbms_aqadm.schedule_propagation(queue_name  => 'ex_q',
destination => 'bubu.du',
start_time  => SYSDATE,
duration    => NULL,
next_time   => NULL,
latency     => 0);
END;
Во второй схеме создаю точно такую же очередь и такую процедуру:
	
PROCEDURE do_loop IS
deqopt    dbms_aq.dequeue_options_t;
mprop     dbms_aq.message_properties_t;
deq_msgid RAW(16);
data      Test2.ex_type;
pragma exception_init(no_messages, -25228);
BEGIN
LOOP
deqopt.navigation    := dbms_aq.next_message;
deqopt.consumer_name := USER;
dbms_aq.dequeue(queue_name         => 'ex_q',
dequeue_options    => deqopt,
message_properties => mprop,
payload            => data,
msgid              => deq_msgid);
COMMIT;
end;
dbms_output.put_line(data.task_id);
END LOOP;
END do_loop;
Запускаю цикл:
begin
do_loop();
end;

Тестируем, в первой схеме запускаю:
Declare
enqopt    dbms_aq.enqueue_options_t;
mprop     dbms_aq.message_properties_t;
data      ex_type;
deq_msgid RAW(16);
BEGIN
mprop.priority := priority;
data           := ex_type(1, Test2@bubu.du, block, priority);
dbms_aq.enqueue('EX_Q', enqopt, mprop, data, deq_msgid);
commit;
Однако результат не вижу. Нужно ли создавать подписчика во второй схеме? Что тут ещё не так?
15 сен 06, 09:51    [3139963]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться с очередями  [new]
Q u a d r o
Member

Откуда: Canada
Сообщений: 1987
Не совсем понятно, что вы пытаетесь достигнуть?

Один вопрос для вас - source и destination схемы в одной базе или разных?
15 сен 06, 10:18    [3140140]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться с очередями  [new]
salexa
Member

Откуда:
Сообщений: 95
Q u a d r o
Не совсем понятно, что вы пытаетесь достигнуть?

Грубо говоря таким образом я буду размножать некоторый код по серверам, в том числе и длительные запросы с отправкой результата куда-нибудь.
Q u a d r o
Один вопрос для вас - source и destination схемы в одной базе или разных?

Пока тестирую на одной
15 сен 06, 10:39    [3140279]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться с очередями  [new]
Tolmachov Dmitiry
Member

Откуда: Москва, Пенза
Сообщений: 1520
А сообщение в первой очереди появляется?
15 сен 06, 11:44    [3140937]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться с очередями  [new]
Tolmachov Dmitiry
Member

Откуда: Москва, Пенза
Сообщений: 1520
Я, кстати, сейчас занимаюсь аналогичной проблемой - передачей сообщений между двумя источником и несколькими удаленными БД посредством очередей. Если интересен мой опыт, то могу выслать test case.
15 сен 06, 11:46    [3140965]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться с очередями  [new]
Valeriy Borysyuk
Member

Откуда: Kiev
Сообщений: 11
Попробую помочь.

Я так понял, не появляются сообщения в дестинейшен очереди, да?
Какой оракл? у меня Oracle9i Enterprise Edition Release 9.2.0.5.0

Давай пройдемся по-порядку по проблемным местам...

1. Пользователи должны иметь необходимые права
У меня вот эти розданы
AQ_ADMINISTRATOR_ROLE
EXECUTE ON SYS.DBMS_AQADM
EXECUTE ON SYS.DBMS_AQ
EXECUTE ON SYS.DBMS_AQIN

2. JOB_QUEUE_PROCESSES Parameter - во что выставлен?
Выполни:
SELECT a.ksppinm "Parameter", b.ksppstvl "Session Value", c.ksppstvl "Instance Value"
FROM x$ksppi a, x$ksppcv b, x$ksppsv c
WHERE a.indx = b.indx AND a.indx = c.indx AND ksppinm='job_queue_processes';

Значение этого параметра должно быть как минимум 2*(кол-во propagation schedules)
Можно установить так, например
ALTER SYSTEM SET JOB_QUEUE_PROCESSES=20;

3. Название ДБ-линка должно быть fully – qualifyed
Example: ‘MY_LINK.US.DB.COM‘ instead of 'MY_LINK‘ – it’s important for propagation to work.

4. Подписчиков создавать необязательно, можно вместо этого при постановке в очередь указать список получателей dbms_aq.message_properties_t recipient_list
Recipient Address should be in form schema.remote_queue_name@DB_Link

вот так, например:
declare
vrecipient_list dbms_aq.AQ$_RECIPIENT_LIST_T;
....
begin
--Prepare recipient_list
vrecipient_list(1):= sys.aq$_agent('AQ_TEST','aq_test.main_queue_d@aq_d.us.db.com', NULL);
..... дальше ставим в очередь
...
msgProp.recipient_list:=vrecipient_list;

dbms_aq.enqueue(queue_name => queueName,
enqueue_options => enqOpt,
message_properties => msgProp,
payload => xmlmsg,
msgid => msgHdl);
COMMIT; -- коммит нужен !!!


5. Проверка, совместимы ли очереди
/* Verify that the source and destination queues have the same type. */
DECLARE
rc BINARY_INTEGER;
BEGIN
DBMS_AQADM.VERIFY_QUEUE_TYPES( src_queue_name => 'main_queue', dest_queue_name => 'main_queue_d',
destination=>'aq_d.us.db.com', rc => rc);
DBMS_OUTPUT.PUT_LINE(rc);
END;

6. Если получишь ORA-25228 то это решается вот так DEQUEUE_OPTIONS_T.WAIT:=1 (какое-то ненулевое значение)

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

Пару ссылок по теме

[url=http://]citforum.ru/database/articles/oraclexmlmess.shtml

[url=http://]www.lc.leidenuniv.nl/awcourse/oracle/appdev.920/a96587/qintro.htm#64906[/url]
15 сен 06, 11:48    [3140987]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться с очередями  [new]
Valeriy Borysyuk
Member

Откуда: Kiev
Сообщений: 11
Хочешь, вышлю полностью рабочий пример с XML-сообщениями?
15 сен 06, 11:52    [3141035]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться с очередями  [new]
salexa
Member

Откуда:
Сообщений: 95
Tolmachov Dmitiry
А сообщение в первой очереди появляется? Я, кстати, сейчас занимаюсь аналогичной проблемой - передачей сообщений между двумя источником и несколькими удаленными БД посредством очередей. Если интересен мой опыт, то могу выслать test case.

Конечно, иначе зачем я её создавал. Перед тем как попасть в очередь они кидаются в табличку, что-то наподобии справочника заданий (часть результата будет возвращено сюда же). Далее процедурка разбирает что куда слать и кидает в очередь. Чей-то чужой опыт всегда инетересен, особенно в данном случае, высылайте.

Valeriy Borysyuk
Попробую помочь.
Я так понял, не появляются сообщения в дестинейшен очереди, да?
Какой оракл? у меня Oracle9i Enterprise Edition Release 9.2.0.5.0

Вроде такой же, уточню в понедельник. Да,сообщения не появляются во 2 очереди.
1. раздавал
2,3. в понедельник посмотрю,проверю
4. пробовал, та же беда.
5. 2 очередь - копия 1
6. а где эту ошиббку посмотреть? в ..shedule..?
Спасибо за ссылки, почитаю. Если есть примеры, кидайте, всегда рад=)
16 сен 06, 01:20    [3145526]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться с очередями  [new]
salexa
Member

Откуда:
Сообщений: 95
В общем снес я все, написал по новой, поставил гранты и заработало, делал без подписчиков. Однако 5 не работает. Пишет, что connection description for remote databse not found.Спасибо за советы, работаю дальше. примеры все ещё жду, интересно посмотреть у кого как реализовано=)
18 сен 06, 12:08    [3149258]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: Помогите разобраться с очередями  [new]
Tolmachov Dmitiry
Member

Откуда: Москва, Пенза
Сообщений: 1520
Добрый день. Очень много вопросов по пропаганде сообщений из одной БД в другую возникает offline. Поэтому прикладываю живой пример. Сообщения идут из БД Gedis в БД Omega через db-link OMEGA_AQXML. Тип сообщения - Oracle object type.

К сообщению приложен файл (_aq_test.zip - 2Kb) cкачать
27 июл 09, 16:01    [7465055]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться с очередями  [new]
KReoN
Member

Откуда:
Сообщений: 25
Valeriy Borysyuk,

спасибо огромное. Ссылка очень помогла.
28 сен 09, 18:10    [7716987]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: Помогите разобраться с очередями  [new]
vipi voxa
Member

Откуда: Отвер Блюда
Сообщений: 6
то есть без db лика, очередь из одной схему не перенести в другую?
6 ноя 18, 12:12    [21725060]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться с очередями  [new]
XMLer
Member

Откуда:
Сообщений: 258
vipi voxa,

Никаких проблем перенести сообщения из одной очереди в другую без БД линка. Если, конечно, обе очереди в одной базе.
13 ноя 18, 11:05    [21732728]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить