Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
AQ 2 MQ
|
|||
|---|---|---|---|
|
#18+
Прошу помощи клуба, по следующему вопросу. Стоит задача осуществить интеграцию между сервисом на ESB и Oracle, используется асинхронная схема; Есть две очереди: запрсов и ответов; Задача заключается в том, что запросы могут отправлятся от разных консьюмеров, и при этом когда происходит чтение, консьюмер должен читать только свои сообщения, то есть необходимо скоррелировать запрос сс ответом. Пробовал писать на форуме Oracle, к сожалению, рекомендаций никаких не получил. FUNCTION request ( v_queue_name varchar2, v_Message varchar2 ) RETURN boolean IS enqueue_options dbms_aq.enqueue_options_t; message_properties dbms_aq.message_properties_t; msgid RAW(16); payload sys.mgw_basic_msg_t; header sys.mgw_name_value_array_t; text_body sys.mgw_text_value_t; text_body_raw sys.mgw_raw_value_t; BEGIN -- Устанавливаем необходимые параметры для MQ header := sys.mgw_name_value_array_t( sys.mgw_name_value_t.construct_integer('MGW_MQ_characterSet', '1208'), sys.mgw_name_value_t.construct_integer('MGW_MQ_priority', '7'), sys.mgw_name_value_t.CONSTRUCT_TEXT('MGW_MQ_replyToQueueName', 'REQEST_QU')); -- Если 1 параметр, то сообщение < 2к, если 2 > 2к text_body := sys.mgw_text_value_t(NULL,v_message); -- Construct the message from its constituent parts. payload := sys.mgw_basic_msg_t(header, text_body, NULL); dbms_aq.enqueue(queue_name => v_queue_name, enqueue_options => enqueue_options, message_properties => message_properties, payload => payload, msgid => msgid); RETURN TRUE; EXCEPTION WHEN OTHERS THEN DBMS_OUTPUT.put_line(SQLERRM); RETURN FALSE; END; +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ FUNCTION request ( v_Q_NAME IN varchar2 ) RETURN boolean IS dequeue_options dbms_aq.dequeue_options_t; message_properties dbms_aq.message_properties_t; msgid RAW(16); payload SYS.MGW_BASIC_MSG_T; header sys.mgw_name_value_array_t; v_CLOB CLOB; v_RC NUMBER; v_BODY CLOB; v_FILE UTL_FILE.file_type; v_ERRMSG VARCHAR2(512); BEGIN DBMS_OUTPUT.enable; -- FIRST_MESSAGE dequeue_options.navigation := 1; dequeue_options.wait := dbms_aq.NO_WAIT; BEGIN dbms_aq.dequeue(queue_name => v_Q_NAME, dequeue_options => dequeue_options, message_properties => message_properties, payload => payload, msgid => msgid); EXCEPTION WHEN OTHERS THEN IF SQLCODE = -25228 THEN RETURN FALSE; ELSE DBMS_OUTPUT.put_line(SQLERRM); END IF; RETURN FALSE; END; -- Проверяем тип строки и в любом случае присваиваем в CLOB v_CLOB := empty_clob(); IF NVL(payload.text_body.small_value,'NO_DATA_FOUND') = 'NO_DATA_FOUND' THEN v_CLOB := payload.text_body.large_value; ELSE v_CLOB := payload.text_body.small_value; END IF; COMMIT; ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.03.2011, 17:27 |
|
||
|
AQ 2 MQ
|
|||
|---|---|---|---|
|
#18+
Опишите задачу более подробно. Не очень понятно, что конкретно требуется. Требуется реализация стандартного механизма Reply to queue с корреляцией по MsgID и CorrelID или какая-то более интелектуальная фильтрация? Кто такие "консьюмеры" и что они могут? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.03.2011, 16:00 |
|
||
|
AQ 2 MQ
|
|||
|---|---|---|---|
|
#18+
BRK01, добрый день! Да требуется реализация стандартного механизма Reply to queue с корреляцией по MsgIDи CorrelID, также хотелось дополнительно отправлять в сообщении кто его отправил и при чтении сообщений, также фильтровать по данному параметру. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.03.2011, 14:47 |
|
||
|
AQ 2 MQ
|
|||
|---|---|---|---|
|
#18+
А в чем, собственно, проблема? Выбирать сообщения по CorrelId - не проблема. Существует распространенная практика использовать PutApplName для заполнением названием источника. Дальше все зависит от версии MQ, если ниже 7, то выбирать придется через jms с помощью селекторов. В 7-ке добавили нативный API для формирования селектров. К тому же, у вас же ESB, в чем проблема на вход потоку подать запрос, поток отправит сообщение в целевую систему, заберет ответ по CorrelID, разберет по содержимому тела и заголовков сообщения, сформирует ответ. Я конечно не знаю вашей полной задачи и архитектуры... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.03.2011, 19:45 |
|
||
|
AQ 2 MQ
|
|||
|---|---|---|---|
|
#18+
BRK01, можете приложить пример кода на PL/SQL ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.03.2011, 21:51 |
|
||
|
AQ 2 MQ
|
|||
|---|---|---|---|
|
#18+
BRK01, с точки зрения формирования запроса, я не вижу проблем: header := sys.mgw_name_value_array_t( sys.mgw_name_value_t.construct_integer('MGW_MQ_characterSet', '1208'), sys.mgw_name_value_t.construct_integer('MGW_MQ_priority', '7'), sys.mgw_name_value_t.CONSTRUCT_TEXT('MGW_MQ_replyToQueueName', 'REQEST_QU'), sys.mgw_name_value_t.CONSTRUCT_TEXT('MGW_MQ_putApplicationName', 'SYSTEM_SPB') sys.mgw_name_value_t.CONSTRUCT_RAW('MGW_MQ_messageId', '231')); При получении ответа мне необходимо разобрать header, там я смогу увидеть ApplName, который отправил, + CorrelationId = 231 или нет ? Буду благодарен за пример на PL/SQL? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.03.2011, 22:00 |
|
||
|
AQ 2 MQ
|
|||
|---|---|---|---|
|
#18+
К сожалению, а может и к счастью, с PL/SQL не знаком. Да, в случае использования Reply2Queue приложение, получившее запрос, должно записать в correlID ответного сообщения содержимое MsgId запроса. Обработчик ответов должен осуществлять выборку сообщений из очереди по CorrelId. Далеее с полученным сообщением можно делать все, что вам вздумается, в том числе и проверку значения PutApplName. Так же здесь стоит учесть тот фактор, что как правило обработчик ждет какое-то время ответа, следовательно, нужна очистка очереди от запоздавших сообщений (либо уставнока параметра тайм-аута у сообщения, тогда МКу за вас все устаревшее удалит). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.03.2011, 17:20 |
|
||
|
|

start [/forum/topic.php?fid=43&msg=37164633&tid=1602344]: |
0ms |
get settings: |
9ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
61ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
36ms |
get tp. blocked users: |
1ms |
| others: | 13ms |
| total: | 151ms |

| 0 / 0 |
