Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / AQ 2 MQ / 7 сообщений из 7, страница 1 из 1
11.03.2011, 17:27
    #37160191
T-S
T-S
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
AQ 2 MQ
Прошу помощи клуба, по следующему вопросу.
Стоит задача осуществить интеграцию между сервисом на 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;
...
Рейтинг: 0 / 0
12.03.2011, 16:00
    #37161181
BRK01
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
AQ 2 MQ
Опишите задачу более подробно.
Не очень понятно, что конкретно требуется.
Требуется реализация стандартного механизма Reply to queue с корреляцией по MsgID и CorrelID или какая-то более интелектуальная фильтрация?
Кто такие "консьюмеры" и что они могут?
...
Рейтинг: 0 / 0
13.03.2011, 14:47
    #37162163
T-S
T-S
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
AQ 2 MQ
BRK01, добрый день!
Да требуется реализация стандартного механизма Reply to queue с корреляцией по MsgIDи CorrelID,
также хотелось дополнительно отправлять в сообщении кто его отправил и при чтении сообщений, также
фильтровать по данному параметру.
...
Рейтинг: 0 / 0
14.03.2011, 19:45
    #37164517
BRK01
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
AQ 2 MQ
А в чем, собственно, проблема?
Выбирать сообщения по CorrelId - не проблема.
Существует распространенная практика использовать PutApplName для заполнением названием источника.
Дальше все зависит от версии MQ, если ниже 7, то выбирать придется через jms с помощью селекторов.
В 7-ке добавили нативный API для формирования селектров.

К тому же, у вас же ESB, в чем проблема на вход потоку подать запрос, поток отправит сообщение в целевую систему, заберет ответ по CorrelID, разберет по содержимому тела и заголовков сообщения, сформирует ответ.

Я конечно не знаю вашей полной задачи и архитектуры...
...
Рейтинг: 0 / 0
14.03.2011, 21:51
    #37164624
T-S
T-S
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
AQ 2 MQ
BRK01,
можете приложить пример кода на PL/SQL ?
...
Рейтинг: 0 / 0
14.03.2011, 22:00
    #37164633
T-S
T-S
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
AQ 2 MQ
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?
...
Рейтинг: 0 / 0
15.03.2011, 17:20
    #37166231
BRK01
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
AQ 2 MQ
К сожалению, а может и к счастью, с PL/SQL не знаком.

Да, в случае использования Reply2Queue приложение, получившее запрос, должно записать в correlID ответного сообщения содержимое MsgId запроса. Обработчик ответов должен осуществлять выборку сообщений из очереди по CorrelId. Далеее с полученным сообщением можно делать все, что вам вздумается, в том числе и проверку значения PutApplName. Так же здесь стоит учесть тот фактор, что как правило обработчик ждет какое-то время ответа, следовательно, нужна очистка очереди от запоздавших сообщений (либо уставнока параметра тайм-аута у сообщения, тогда МКу за вас все устаревшее удалит).
...
Рейтинг: 0 / 0
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / AQ 2 MQ / 7 сообщений из 7, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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