Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
IIB (WebSphere MQ) перехватить событие
|
|||
|---|---|---|---|
|
#18+
Как перехватить событие когда очередь началась заполняться? К примеру если нужно каждый раз перед загрузкой новых данных (в очередь), выполнить определенные запросы в бд. Или выполнить какие-нибудь вычисления. Как быть, считать сообщения? Sequence? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.06.2015, 16:48 |
|
||
|
IIB (WebSphere MQ) перехватить событие
|
|||
|---|---|---|---|
|
#18+
golovonometr, Некторые базы данных, умеют отображать очереди MQ как таблицы - DB2, Informix, Oracle ... Насколько Я помню к mq-очередям можно применять запрос на наличие сообщений в очереди без их извлечения. Можно создать триггеры в MQ, можно написать расширения (плагины) на разных уровнях MQ (канальном, очереди и т.д.). Много полезной информации можно найти здесь - http://www.ibm.com/developerworks/websphere/zones/businessintegration/wmq.html Configuring and using XA transactions with WebSphere MQ V6 Classes for Java - http://www.ibm.com/developerworks/websphere/library/techarticles/0601_ritchie/0601_ritchie.html Business Integration - WebSphere MQ SupportPacs http://www-01.ibm.com/support/docview.wss?rs=977&uid=swg27007205 IBM WebSphere MQ V7.1 and V7.5 Features and Enhancements - http://www.redbooks.ibm.com/abstracts/sg248087.html WebSphere MQ Primer: An Introduction to Messaging and WebSphere MQ - http://www.redbooks.ibm.com/abstracts/redp0021.html?Open PS: Integrating Oracle database applications with WebSphere MQ applications - http://www.ibm.com/developerworks/websphere/library/techarticles/0807_tuli/0807_tuli.html C уважением, Вадим. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.06.2015, 21:25 |
|
||
|
IIB (WebSphere MQ) перехватить событие
|
|||
|---|---|---|---|
|
#18+
непонятно что вы имели ввиду под триггерами в MQ, их вроде как нет там. А что касается возможности базы отображать очередь mq как таблицу, чет не совсем ясно. Но меня больше интересует сама возможность на стороне MQ, рулить данными. Простой пример - два потока, первый поток занимается сбором данных, второй сохранением, но перед очередным сохранением нужно очистить таблички в бд. Есть конечно рукожопный вариант - записывать в бд, потом каждый раз проверять на последнюю запись. Но это не дело ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.06.2015, 12:56 |
|
||
|
IIB (WebSphere MQ) перехватить событие
|
|||
|---|---|---|---|
|
#18+
golovonometr, Не очень понятен вопрос. В WMB / IIB обработка событий в message flow и так происходит по мере поступления их в очередь. Есть узел MQGet, который позволяет конфигурировать, вычитывать сообщение из очереди или нет. Если речь идет об уровне WMQ, то отслеживать операции GET / PUT можно с помощью UserExit'ов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.06.2015, 17:36 |
|
||
|
IIB (WebSphere MQ) перехватить событие
|
|||
|---|---|---|---|
|
#18+
спасибо, это понятно. Просто не совсем ясно было как ослеживать такие моменты как начало записи в очередь, в случае с FileInput решилось InputLocalEnvironment.File.Record. Это позволяет проверить хотя бы на то что запись с файла поступила первая или нет. Но в другой ситуации пришлось бы кидать наверно специальное сообщение в очередь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.06.2015, 10:27 |
|
||
|
IIB (WebSphere MQ) перехватить событие
|
|||
|---|---|---|---|
|
#18+
golovonometr, "Классика" для WMQ: 1. Создать специальную локальную очередь для программы "триггер-монитор". 2. Запустить программу "триггер-монитор", указав созданную очередь в качестве входной. 3. Создать объект типа "процесс", в нем описать программу, которая будет запускаться для чтения сообщений в целевой очереди. 3. На целевой очереди (в которую поступают сообщения) поменять параметры, включив триггер на первое сообщение в очереди. Указать очередь триггера (п.1) и процесс обработки (п.3) Что будет происходить: При поступлении первого сообщения в целевую очередь будет сгенерировано служебное (триггерное) сообщение в очередь триггер-монитора. Триггер-монитор, получив сообщение прочитает из него имя процесса обработки и запустит программу, которая там указана. Программа должна будет считать и обработать все сообщения в очереди, после чего завершить свою работу. Триггерные сообщения будут генерироваться только тогда, когда запущена программа триггер-монитор. Этот подход для данного случая не единственный и, возможно, не самый надежный. Возможно, тут больше подойдет такой подход: При передаче и приеме сообщений использовать "логический блок сообщений" (Message Group). В этом случае можно сформировать и потом считать последовательность сообщений, которые будут одной "группой" и будут иметь возрастающий номер внутри группы. Плюс, при чтении, можно указать флаг начать обработку группы сообщений только тогда, когда все сообщения группы станут доступны в целевой очереди (MQGMO_ALL_MSGS_AVAILABLE). Подробнее здесь: Grouping logical messages . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.06.2015, 11:51 |
|
||
|
IIB (WebSphere MQ) перехватить событие
|
|||
|---|---|---|---|
|
#18+
Евгений Хабаров, я не думаю что это надежное решение. Представьте ситуацию, как я описал выше. Когда в целевую очередь поступают какие-то данные например из файла, но перед каждой загрузкой нужно выполнять truncate. Может случиться, что первое сообщение разберется и распарсится быстрей, чем сработает truncate. Мы же не собираемся рисовать всю схему в одном flow. Нас же интересует разбить на несколько flow, чтоб была возможность создавать несколько инстансов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.06.2015, 16:28 |
|
||
|
IIB (WebSphere MQ) перехватить событие
|
|||
|---|---|---|---|
|
#18+
golovonometr, Какое из двух приведенных решений имеется в виду? Триггер или группа сообщений? Файл на вход поступает одним сообщением или несколькими? Если файл поступает на вход таким образом, что каждая строка(запись) формирует отдельное сообщение (?), то как раз Message Group может помочь. Или хочется распараллелить обработку каждой строки? Для большей конкретики нужно более подробное описание задачи, что, откуда и в каком виде может приходить, какие Flow предполагаются, какой препроцессинг (тот же truncate) и когда нужен. На каких этапах нужен параллелизм? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.07.2015, 10:32 |
|
||
|
IIB (WebSphere MQ) перехватить событие
|
|||
|---|---|---|---|
|
#18+
Евгений Хабаровgolovonometr, Какое из двух приведенных решений имеется в виду? Триггер или группа сообщений? Файл на вход поступает одним сообщением или несколькими? Если файл поступает на вход таким образом, что каждая строка(запись) формирует отдельное сообщение (?), то как раз Message Group может помочь. Или хочется распараллелить обработку каждой строки? Для большей конкретики нужно более подробное описание задачи, что, откуда и в каком виде может приходить, какие Flow предполагаются, какой препроцессинг (тот же truncate) и когда нужен. На каких этапах нужен параллелизм? Да каждая строка формирует отдельное сообщение, и параллелить хочется. Например, чтение из файла распараллелить не получится, но оно происходит быстро. Этот процесс можно считать мгновенным, но вот преобразование и сохранение в бд (в другую систему). Может продолжаться довольно длительный период. И этот процесс просто напрашивается на параллельное выполнение. Препроцессинг, нужен в начале когда файл попадает на обработку, и хорошим тоном был бы постпроцессинг в конце, когда файл полностью обработан, чтоб можно было завершить или откатить транзакции. Было бы очень хорошо совершить весь процесс за короткий промежуток времени ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.07.2015, 13:12 |
|
||
|
IIB (WebSphere MQ) перехватить событие
|
|||
|---|---|---|---|
|
#18+
golovonometrЕвгений Хабаровgolovonometr, Какое из двух приведенных решений имеется в виду? Триггер или группа сообщений? Файл на вход поступает одним сообщением или несколькими? Если файл поступает на вход таким образом, что каждая строка(запись) формирует отдельное сообщение (?), то как раз Message Group может помочь. Или хочется распараллелить обработку каждой строки? Для большей конкретики нужно более подробное описание задачи, что, откуда и в каком виде может приходить, какие Flow предполагаются, какой препроцессинг (тот же truncate) и когда нужен. На каких этапах нужен параллелизм? Да каждая строка формирует отдельное сообщение, и параллелить хочется. Например, чтение из файла распараллелить не получится, но оно происходит быстро. Этот процесс можно считать мгновенным, но вот преобразование и сохранение в бд (в другую систему). Может продолжаться довольно длительный период. И этот процесс просто напрашивается на параллельное выполнение. Препроцессинг, нужен в начале когда файл попадает на обработку, и хорошим тоном был бы постпроцессинг в конце, когда файл полностью обработан, чтоб можно было завершить или откатить транзакции. Было бы очень хорошо совершить весь процесс за короткий промежуток времени А анализ в каком именно месте происходят задержки есть? Т.е. проверено ли утверждение, что "расписывание" 100 строк файла в 100 потоков параллельно дает существенный выигрыш по времени по сравнению с "расписыванием" этих же 100 строк в один поток (последовательно)? Сколько в среднем строк в файле? Каков средний размер файла и строки? Сильно ли отличается алгоритм обработки строки, в зависимости от данных в этой строке? Если каждая строка файла примерно одинакова и раскладывается по общему набору таблиц, то распараллеливание может дать не прирост, а просадку по производительности, т.к. будет открыто N-соединений с СУБД, будет идти параллельная вставка в единое подмножество таблиц, что может приводить к блокировкам и конкуренции за ресурсы СУБД. Дополнительно, если каждая строка обрабатывается в отдельном потоке, то вопрос что делать, если файл обработался частично? Например обработались строки с 1 по 10, а на 11 - некорректные данные. В зависимости от технологии - может потребоваться откат для всего файла, в этом случае из параллельных потоков этого сделать нельзя, тк каждый поток будет отдельной транзакцией. Т.е. если задержки на стороне СУБД - имеет смысл разбираться почему. Возможно, для ускорения работы нужно переделать код INSERT/UPDATE, чтобы задействовать пакетный режим, aka batch update (один prepare, много bindParams + addBatch, один execute). Возможно, результат парсинга файла имеет смысл поместить во временной таблице(ах), и уже после этого выполнять SQL-операторы, которые перенесут данные из временных таблиц в целевые. Это может избавить от необходимости делать truncate, тк временные таблицы автоматически будут удалены при commit или disconnect (зависит от опций создания и СУБД). Если есть проблемы в скорости соединения между брокером и СУБД, возможно имеет смысл использовать исполнение прикладного кода на стороне СУБД (хранимые процедуры например), а на вход подавать либо сам файл, либо значения из каждой строки файла, либо заполненные временные таблицы, содержащие преобразованный файл. Пока я считаю, что проблему с недостаточной производительностью можно решить более простым и прямым способом, нежели формированием отдельных сообщений на каждую строку файла и параллельной вставкой в СУБД этих данных. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.07.2015, 14:54 |
|
||
|
IIB (WebSphere MQ) перехватить событие
|
|||
|---|---|---|---|
|
#18+
Евгений Хабаров А анализ в каком именно месте происходят задержки есть? Т.е. проверено ли утверждение, что "расписывание" 100 строк файла в 100 потоков параллельно дает существенный выигрыш по времени по сравнению с "расписыванием" этих же 100 строк в один поток (последовательно)? Сколько в среднем строк в файле? Каков средний размер файла и строки? Сильно ли отличается алгоритм обработки строки, в зависимости от данных в этой строке? Если каждая строка файла примерно одинакова и раскладывается по общему набору таблиц, то распараллеливание может дать не прирост, а просадку по производительности, т.к. будет открыто N-соединений с СУБД, будет идти параллельная вставка в единое подмножество таблиц, что может приводить к блокировкам и конкуренции за ресурсы СУБД. Дополнительно, если каждая строка обрабатывается в отдельном потоке, то вопрос что делать, если файл обработался частично? Например обработались строки с 1 по 10, а на 11 - некорректные данные. В зависимости от технологии - может потребоваться откат для всего файла, в этом случае из параллельных потоков этого сделать нельзя, тк каждый поток будет отдельной транзакцией. Т.е. если задержки на стороне СУБД - имеет смысл разбираться почему. Возможно, для ускорения работы нужно переделать код INSERT/UPDATE, чтобы задействовать пакетный режим, aka batch update (один prepare, много bindParams + addBatch, один execute). Возможно, результат парсинга файла имеет смысл поместить во временной таблице(ах), и уже после этого выполнять SQL-операторы, которые перенесут данные из временных таблиц в целевые. Это может избавить от необходимости делать truncate, тк временные таблицы автоматически будут удалены при commit или disconnect (зависит от опций создания и СУБД). Если есть проблемы в скорости соединения между брокером и СУБД, возможно имеет смысл использовать исполнение прикладного кода на стороне СУБД (хранимые процедуры например), а на вход подавать либо сам файл, либо значения из каждой строки файла, либо заполненные временные таблицы, содержащие преобразованный файл. Пока я считаю, что проблему с недостаточной производительностью можно решить более простым и прямым способом, нежели формированием отдельных сообщений на каждую строку файла и параллельной вставкой в СУБД этих данных. не скажу за 100 - скажу за 5, существенный выигрыш! Файлы разные от 110 строк, до 1 500 000, длина строки от 45 символов до 870. Размер от несколько килобайт, до 1 Гб Нет никаких проблем с конкуренцией в БД. Вроде как не наблюдали пока. Да конечно, или вставка всех данных или никаких, в требовании очистить таблицы и раструбить на всю деревню, что данные не загружены из-за ошибки. Давно используем PreperedStatement, и конечно же addBatch(). В случае отдельных потоков это легко решается они получают Connection, который можно закоммитить после отработки всех задействованных потоков. Но средствами integration bus, по-моему такое не возможно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.07.2015, 17:00 |
|
||
|
|

start [/forum/topic.php?fid=43&msg=38996574&tid=1600782]: |
0ms |
get settings: |
10ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
74ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
48ms |
get tp. blocked users: |
1ms |
| others: | 282ms |
| total: | 453ms |

| 0 / 0 |
