Oracle aq что это такое

Обновлено: 03.07.2024

Oracle Streams — это функция, которая позволяет распространять и управлять данными, транзакциями и событиями в потоке данных либо внутри базы данных, либо из одной базы данных в другую. Это можно использовать как для репликации, так и для обмена сообщениями. Функция Advanced Queuing (AQ) обеспечивает поддержку обмена сообщениями. Эта поддержка обмена сообщениями будет интегрирована со стандартным JMS API, поставляемым с Java. Поскольку поддержка AQ выполняется в базе данных, можно использовать одну и ту же транзакцию как для обмена сообщениями, так и для доступа к базе данных. Это устраняет необходимость в дорогостоящей двухэтапной обработке фиксации, которая была бы необходима при интеграции доступа к базе данных с традиционным решением JMS.

Большая часть поддержки JMS, которую мы обсуждаем в этой главе, обеспечивается непосредственно Spring Framework. Подробнее о поддержке JMS см. в Справочной документации Spring Framework.

Помимо этой стандартной поддержки, пакет Advance Pack для Oracle Database обеспечивает более простую настройку фабрики соединений с использованием пространства имен. Он также обеспечивает поддержку некоторых типов полезной нагрузки, не поддерживаемых напрямую поддержкой Spring JMS, таких как XMLType и пользовательские расширенные типы данных.

4.1 Поддерживаемые типы полезной нагрузки

JMS и Oracle Streams AQ могут поддерживать различные полезные нагрузки. Эти полезные нагрузки хранятся в базе данных и должны быть преобразованы в представление Java, чтобы наши программы могли ими манипулировать. В следующей таблице указано, какие полезные нагрузки поддерживаются, и соответствующие классы, которые будут работать с этими полезными нагрузками и смогут преобразовывать их в представление Java и из него.

Таблица 4.1. поддерживаемые типы полезной нагрузки

Тип полезной нагрузкиПоддержка Примечания
SYS.AQ$_JMS_TEXT_MESSAGE, SYS. AQ$_JMS_MAP_MESSAGE, SYS.AQ$_JMS_OBJECT_MESSAGE, SYS.AQ$_JMS_BYTES_MESSAGE Непосредственно поддерживается SimpleMessageConverter, который используется по умолчанию для JmsTemplate и DefaultMessageListenerContainer . При настройке контейнера прослушивателя сообщений DefaultMessageListenerContainer — это класс, поддерживающий функции Oracle AQ JMS.
SYS.XMLType Для этого типа полезной нагрузки требуется настраиваемый контейнер прослушивателя сообщений с именем XmlMessageListenerContainer . Для этого контейнера прослушивателя также требуется MessageListenerAdapter с конвертером сообщений Oracle AQ XML, указанным как XmlMessageConverter . Подробнее о конфигурации см. ниже.
настраиваемый расширенный тип данных (ADT) (CREATE TYPE xxx AS OBJECT) Для этого типа полезной нагрузки требуется настраиваемый контейнер прослушивателя сообщений с именем AdtMessageListenerContainer . Этот контейнер прослушивателя также может использовать MessageListenerAdapter с преобразователем сообщений Oracle AQ ADT, указанным как MappingAdtMessageConverter . Этот преобразователь работает с реализацией интерфейса DatumMapper. Подробнее о конфигурации см. ниже.

4.2 Настройка фабрики соединений с использованием пространства имен "orcl"

При использовании JmsTemplate вместе с поддержкой Oracle AQ JMS можно использовать запись aq-jms-connection-factory, чтобы предоставить фабрику соединений для JmsTemplate.

1

Здесь мы указываем ссылку на схему orcl.

2

Мы также указываем расположение схемы orcl.

3

Фабрика соединений настраивается с использованием ссылки на используемый источник данных.

Конфигурация управляемого сообщениями POJO с MessageListenerContainer очень похожа. Вы используете тот же тип заводской конфигурации соединения. Это передается в конфигурацию контейнера прослушивателя. Вот пример использования поддержки пространства имен JMS.

1

Здесь мы указываем ссылку на схемы orcl и jms.

2

Мы также указываем расположение схем orcl и jms.

4

Контейнер прослушивателя настраивается с использованием ссылки на фабрику соединений.

4

Фабрика соединений настраивается с использованием ссылки на используемый источник данных.

См. следующий раздел, чтобы узнать, как настроить поддержку транзакций и использовать ту же локальную транзакцию, что и доступ к данным JDBC или ORM.

4.3 Настройка фабрики соединений для использования той же локальной транзакции, что и ваш код доступа к данным.

Конфигурации из предыдущего раздела будут использовать синхронизацию транзакций, предоставляемую Spring, но транзакций будет две. Одна транзакция для доступа к данным и одна для обмена сообщениями JMS. Они будут синхронизированы, поэтому, если транзакция доступа к данным будет зафиксирована, транзакция обмена сообщениями также будет зафиксирована, а если транзакция доступа к данным откатится, то транзакция обмена сообщениями также будет откатана.

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

Лучшее решение – настроить доступ к данным и обмен сообщениями для обмена транзакциями. Чаще всего это делается с помощью JTA, и это работает, но имеет некоторое влияние на производительность. Для JTA вам необходимо использовать распределенные транзакции и ресурсы с поддержкой XA, предназначенные для двухэтапных коммитов. Это происходит за дополнительную плату, которую мы стараемся по возможности избегать.

Еще один вариант — предоставить доступ к данным и обмен сообщениями через локальную транзакцию доступа к данным. Это возможно, поскольку реализация Oracle AQ состоит из набора таблиц и хранимых процедур, работающих в базе данных, доступ к которой осуществляется через стандартное соединение JDBC. Если вы используете одну и ту же базу данных для доступа к данным и обмена сообщениями с AQ, вы можете настроить фабрику соединений для совместного использования соединения с базой данных и локальной транзакции. Вы настраиваете это подключение и общий доступ к транзакциям, задавая для атрибута use-local-data-source-transaction значение true .

1

Установка атрибута use-local-data-source-transaction .

Настройка фабрики соединений для совместного использования транзакции локального источника данных с кодом доступа к данным имеет некоторые последствия для соединения JMS и кэширования сеанса. Вы по-прежнему можете настроить MessageListenerContainer для кэширования соединения JMS, поскольку каждый сеанс JMS будет создаваться по мере необходимости внутри транзакции источника данных. Однако если вы кэшируете сеанс JMS, то соединение с базой данных для него устанавливается при запуске контейнера, и этот кэшированный сеанс JMS не может участвовать в транзакции локального источника данных.

Во многих средах серверов приложений соединение JDBC заключено в класс, специфичный для реализации, который делегирует базовое собственное соединение JDBC. Фабрике соединений Oracle AQ требуется собственное соединение Oracle, и она выдаст исключение «oracle.jms.AQjmsException: JMS-112: соединение недопустимо», если соединение заключено в чужой класс. Чтобы решить эту проблему, вы можете указать NativeJdbcExtractor, который можно использовать для развертывания соединения. Spring предоставляет ряд реализаций, соответствующих среде сервера приложений. Вот пример указания NativeJdbcExtractor .

1

Здесь мы указываем ссылку на собственный экстрактор JDBC.

В некоторых случаях обычная фабрика соединений по умолчанию не работает, и вам необходимо явно использовать фабрики очередей или фабрики топикконнектонов. Для поддержки этого требования можно указать это с помощью атрибута типа фабрики соединения. По умолчанию используется CONNECTION, но вместо этого вы можете указать QUEUE_CONNECTION или TOPIC_CONNECTION. Вот пример указания типа фабрики соединений.

Oracle Advanced Queuing — это настраиваемая и масштабируемая функция обмена сообщениями Oracle Database. Он имеет интерфейсы на разных языках, что позволяет интегрировать несколько инструментов в вашу архитектуру.

В cx_Oracle 7.2 представлен обновленный интерфейс для Oracle Advanced Queuing.

В каталоге примеров GitHub есть примеры Advanced Queuing.

Создание очереди¶

Перед использованием очереди необходимо создать в базе данных, например, в SQL*Plus:

В этом примере создается очередь RAW, подходящая для отправки строковых или необработанных байтовых сообщений.

Постановка сообщений в очередь¶

Чтобы отправлять сообщения в Python, вы подключаетесь и получаете очередь. Очередь можно использовать для постановки в очередь, исключения из очереди или для того и другого по мере необходимости.

Теперь сообщения можно ставить в очередь с помощью enqone() . Чтобы отправить три сообщения:

Поскольку очередь, отправляющая сообщения, является очередью RAW, строки в этом примере перед помещением в очередь будут внутренне закодированы в байты с использованием Connection.encoding.

Изъятие сообщений из очереди¶

Изъятие из очереди выполняется аналогичным образом. Чтобы удалить сообщение из очереди, вызовите метод deqone(), как показано ниже. Обратите внимание: если ожидается, что сообщение будет строкой, байты должны быть декодированы с помощью Connection.encoding .

Использование очередей объектов¶

Именованные объекты Oracle также можно ставить в очередь и извлекать из нее. Учитывая тип объекта с именем UDT_BOOK :

И очередь, которая принимает этот тип:

Вы можете поставить сообщения в очередь:

Изъятие из очереди выполняется следующим образом:

Изменение параметров очереди и сообщений¶

См. документацию по cx_Oracle AQ API и Oracle Advanced Queuing для получения подробной информации обо всех доступных параметрах постановки в очередь и удаления из очереди.

Можно установить параметры постановки в очередь. Например, чтобы сделать так, чтобы явный вызов commit() в соединении не требовался для фиксации сообщений:

Также можно задать параметры удаления из очереди. Например, чтобы не блокировать удаление из очереди, если нет доступных сообщений:

Свойства сообщения можно задать при постановке в очередь. Например, чтобы установить срок действия сообщения 60 секунд:

Это означает, что если в течение 60 секунд не будет выполнено удаление из очереди, сообщение будет удалено из очереди.

Массовая постановка и удаление из очереди¶

Методы enqmany() и deqmany() можно использовать для эффективной обработки массовых сообщений.

enqmany() похож на enqone(), но принимает массив сообщений:

Вызов enqmany() параллельно для разных подключений, полученных из одного и того же пула, может завершиться ошибкой из-за ошибки Oracle 29928074. Убедитесь, что эта функция не выполняется параллельно, используйте автономные подключения или подключения из разных пулов или сделайте несколько вызовов enqone. () вместо. Вызов функции deqmany() не затрагивается.

Чтобы одновременно удалить из очереди несколько сообщений, используйте deqmany() . Это принимает аргумент, указывающий максимальное количество сообщений, которые нужно исключить из очереди за один раз:

В зависимости от свойств очереди и количества сообщений, доступных для удаления из очереди, этот код выведет от нуля до десяти сообщений.

© Copyright 2016, 2020, Oracle и/или ее дочерние компании. Все права защищены. Copyright © 2007-2015, Энтони Туининга. Все права защищены. Авторские права на части принадлежат © 2001-2007, Computronix (Canada) Ltd., Эдмонтон, Альберта, Канада. Все права защищены. Редакция 5728cf53 . Последнее обновление: 04 ноября 2021 г.

Advanced Queuing (AQ) — это гибкий механизм обмена сообщениями, встроенный в сервер Oracle. С помощью AQ вы можете отправлять сообщения с рабочей станции или сервера на одну или несколько рабочих станций. dotConnect для Oracle включает в себя набор классов, использующих эту технологию.

Эта функция доступна только в версиях Professional и Developer Edition.

В этом разделе содержится информация и примеры, которые помогут вам начать работу с AQ. Он состоит из следующих разделов:

Основы AQ

В Advanced Queuing поддерживаются стандартные функции базы данных, такие как восстановление, перезапуск и безопасность, а таблицы очередей можно импортировать и экспортировать. Advanced Queuing предоставляет функции управления сообщениями и асинхронную связь, необходимые для интеграции приложений.

Advanced Queuing — сложная область, поэтому рекомендуется прочитать официальную документацию, чтобы лучше понять аспекты и возможности AQ.

Advanced Queuing отправляет и получает сообщения двумя способами:

В этой статье рассматриваются оба способа.

Вы также можете ознакомиться с образцом Queue в демонстрационном пакете WinForms.

Простой пример двухточечного обмена сообщениями

В следующем примере показано, как использовать Advanced Queuing в простейшей форме. Он представляет собой схему обмена сообщениями «точка-точка», при которой сообщения удаляются с сервера после того, как их использует получатель. В примере выполняется точно следующее:

  1. Подготавливает очередь
  2. Отправляет сообщение
  3. Получает сообщение
  4. Уничтожает запрос

Существует несколько способов поведения метода OracleQueue.Dequeue(). Это зависит от значения свойства OracleQueueDequeueOptions.WaitTimeout. Когда это значение равно -1 (по умолчанию), метод Dequeue() ожидает прихода сообщения и не возвращает значение до тех пор, пока сообщение не прибудет. Когда значение равно 0, метод Dequeue() проверяет наличие сообщения и немедленно возвращает значение. Если сообщения нет, генерируется исключение.Когда значение представляет собой положительное целое число, оно обозначает количество секунд ожидания сообщения. Если в течение этого времени ожидания не получено ни одного сообщения, создается исключение.

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

Расширенный пример двухточечного обмена сообщениями

В следующем примере код из предыдущего раздела немного изменен. Во-первых, чтобы избежать создания определяемых пользователем типов для обмена сообщениями, тип полезной нагрузки изменен на RAW. Во-вторых, приоритет присваивается одному из сообщений, отправленных через механизм AQ. В-третьих, сообщения принимаются более реальным способом, с циклами и ограниченными тайм-аутами.

Простой пример многоточечного обмена сообщениями

В схеме "точка-многоточка" один издатель генерирует сообщения для нескольких подписчиков. Издатель может указать, кто именно получит сообщение. По умолчанию срок действия сообщений не истекает, и они удаляются либо при удалении из очереди в режиме Remove, либо при уничтожении таблицы. Каждому сообщению можно назначить время жизни при его отправке.

Следующий пример иллюстрирует схему "точка-многоточка" в одном приложении (хотя обычно потребителями являются совершенно разные приложения). В этом примере демонстрируется еще один принцип удаления из очереди: каждый потребитель запускает событие, когда доступно новое сообщение.

Администрирование

Технология AQ включает в себя множество параметров, настроек и возможностей как для постановки сообщений в очередь, так и для исключения их из очереди. Для поддержки этого набора функций dotConnect for Oracle представляет широкий набор классов в пространстве имен Oracle. Публичный интерфейс этих классов сделан похожим на интерфейс серверных пакетов Oracle, поэтому вы можете обратиться к официальной документации за подробной информацией о том, что стоит за многочисленными методами и свойствами.

Как видно из трех примеров в этой статье, большинство административных задач можно выполнить с помощью классов OracleQueueTable и OracleQueueAdmin. Обратите внимание, что для администрирования очередей часто требуется широкий набор привилегий в базе данных.

В Oracle Database 11g Release 2 (11.2) добавлена ​​поддержка очередей XMLType. До Oracle Database 11g Release 1 (11.1) поддерживаемыми типами очередей были RAW , ADT и типы очередей ANYDATA.

В этой главе рассматриваются следующие темы:

Функциональность и структура Oracle Advanced Queuing

Пакет Oracle JDBC oracle.jdbc.aq предоставляет быстрый интерфейс Java для AQ. Этот пакет содержит следующее:

Указывает параметры, доступные для операции удаления из очереди

Указывает параметры, доступные для операции постановки в очередь

Является фабричным классом для AQ

Создается всякий раз, когда новое сообщение помещается в очередь, для которой вы зарегистрировали свой интерес

Используется для представления и идентификации пользователя очереди или производителя или потребителя сообщения

Представляет сообщение, поставленное в очередь или исключенное из очереди

Содержит свойства сообщения, такие как корреляция, отправитель, задержка и срок действия, получатели, а также приоритет и порядок

Интерфейс прослушивателя для получения событий уведомления AQ

Представляет вашу заинтересованность в получении уведомлений, когда новое сообщение помещается в определенную очередь

Эти классы и интерфейсы позволяют вам получать доступ к существующей очереди, создавать сообщения, а также ставить и удалять сообщения из очереди.

Драйверы Oracle JDBC не предоставляют никакого API для создания очереди. Очереди должны создаваться с помощью пакета DBMS_AQADM PL/SQL.

Для получения дополнительной информации об API см. Javadoc по адресу

Внесение изменений в базу данных

Фрагменты кода, использованные в этой главе, предполагают, что пользователь SCOTT подключается к базе данных. Поэтому в базе данных вы должны предоставить SCOTT следующие привилегии:

Прежде чем вы начнете ставить сообщения в очередь и удалять их из очереди, в базе данных должны быть очереди. Для этого необходимо выполнить следующее:

Создайте таблицу очереди следующим образом:

Создайте очередь следующим образом:

Запустите очередь следующим образом:

Рекомендуется остановить очередь и удалить таблицы очереди из базы данных. Вы можете сделать это следующим образом:

Остановите очередь следующим образом:

Удалите таблицы очередей из базы данных следующим образом:

Уведомление об асинхронном событии AQ

Приложение JDBC может выполнять следующие действия:

Зарегистрируйтесь в пространстве имен AQ и получайте уведомления при возникновении очереди. Это можно сделать следующим образом:

Регистрируйте подписки на события базы данных и получайте уведомления, когда события инициируются

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

В следующем фрагменте кода показано, как подписаться на события базы данных и получать уведомления, когда события инициируются:

Создание сообщений

Прежде чем поставить сообщение в очередь, вы должны его создать. Экземпляр класса, реализующего интерфейс AQMessage, представляет сообщение AQ. Сообщение AQ содержит свойства (метаданные) и полезную нагрузку (данные). Выполните следующие действия, чтобы создать сообщение AQ:

Создайте экземпляр AQMessageProperties следующим образом:

Задайте атрибуты свойства следующим образом:

Создайте сообщение AQ с помощью объекта AQMessageProperties следующим образом:

Установите полезную нагрузку следующим образом:

Свойства сообщения AQ

Свойства сообщения AQ представлены экземпляром интерфейса AQMessageProperties. Вы можете установить или получить следующие свойства сообщения:

Число попыток удаления сообщения из очереди. Указывает количество попыток удаления сообщения из очереди. Это свойство не может быть установлено.

Корреляция: идентификатор, предоставляемый производителем сообщения во время постановки сообщения в очередь.

Задержка: количество секунд, в течение которых сообщение находится в состоянии ОЖИДАНИЯ. После указанной задержки сообщение находится в состоянии READY и доступно для удаления из очереди. Удаление сообщения из очереди с использованием идентификатора сообщения (msgid) переопределяет спецификацию задержки.

Задержка не поддерживается при буферизованном обмене сообщениями.

Режим доставки: указывает, является ли сообщение буферизованным сообщением или постоянным сообщением. Это свойство не может быть установлено.

Время постановки в очередь: указывает время, когда сообщение было поставлено в очередь. Это значение определяется системой и не может быть установлено пользователем.

Очередь исключений: указывает имя очереди, в которую перемещается сообщение, если оно не может быть успешно обработано. Сообщения перемещаются в двух случаях:

Количество неудачных попыток удаления из очереди превысило max_retries .

Срок действия сообщения истек.

Срок действия: количество секунд, в течение которых сообщение доступно для исключения из очереди, начиная с момента, когда сообщение переходит в состояние ГОТОВО. Если сообщение не удалено из очереди до истечения срока его действия, оно перемещается в очередь исключений в состоянии EXPIRED.

Состояние сообщения: указывает состояние сообщения во время удаления сообщения из очереди. Это свойство не может быть установлено.

Идентификатор сообщения в предыдущей очереди: идентификатор сообщения в последней очереди, создавшей текущее сообщение. Когда сообщение передается из одной очереди в другую, этот атрибут определяет идентификатор очереди, из которой оно было передано в последний раз. Это свойство не может быть установлено.

Приоритет: определяет приоритет сообщения. Это может быть любое целое число, включая отрицательные целые числа; чем меньше значение, тем выше приоритет.

Список получателей: список объектов AQAgent, представляющих получателей. Получателями по умолчанию являются подписчики очереди. Этот параметр допустим только для очередей с несколькими потребителями.

Отправитель: идентификатор, указанный производителем во время постановки сообщения в очередь. Это экземпляр AQAgent .

Группа транзакций: указывает группу транзакций сообщения для очередей, сгруппированных по транзакциям. Он устанавливается после успешного вызова метода dequeueArray.

Полезная нагрузка сообщения AQ

В зависимости от типа очереди полезная нагрузка сообщения AQ может быть указана с помощью метода setPayload интерфейса AQMessage. В следующем фрагменте кода показано, как установить полезную нагрузку:

Вы можете получить полезную нагрузку сообщения AQ, используя метод getPayload или соответствующий метод get XXX Payload следующим образом:

Эти методы определены в интерфейсе AQMessage.

Пример: создание сообщения и настройка полезной нагрузки

В этом разделе приведен пример, иллюстрирующий создание сообщения и установку полезной нагрузки.

Пример 25-1. Создание сообщения и установка полезной нагрузки

В этом примере показано, как создать экземпляр AQMessageProperties , задать атрибуты свойства, создать сообщение AQ и установить полезную нагрузку.

Постановка сообщений в очередь

После того как вы создадите сообщение и зададите его свойства и полезные данные, вы можете поставить сообщение в очередь, используя метод enqueue интерфейса OracleConnection. Прежде чем поставить сообщение в очередь, вы можете указать некоторые параметры постановки в очередь. Класс AQEnqueueOptions позволяет указать следующие параметры постановки в очередь:

Режим доставки: определяет режим доставки. Режим доставки может быть либо постоянным (ENQUEUE_PERSISTENT), либо буферизованным (ENQUEUE_BUFFERED).

Получить идентификатор сообщения: указывает, должен ли быть получен идентификатор сообщения с сервера, когда сообщение поставлено в очередь. По умолчанию идентификатор сообщения не извлекается.

Преобразование: указывает преобразование, которое будет применяться перед помещением сообщения в очередь. Тип возвращаемого значения функции преобразования должен соответствовать типу очереди.

Преобразования должны быть созданы в PL/SQL с использованием DBMS_TRANSFORM.CREATE_TRANSFORMATION(. ) .

Видимость: определяет транзакционное поведение запроса на постановку в очередь. Значение по умолчанию для этого параметра — ENQUEUE_ON_COMMIT. Это указывает на то, что операция постановки в очередь является частью текущей транзакции. ENQUEUE_IMMEDIATE указывает, что операция постановки в очередь является автономной транзакцией, которая фиксируется в конце операции. Для буферизованного обмена сообщениями необходимо использовать ENQUEUE_IMMEDIATE .

В следующем фрагменте кода показано, как задать параметры постановки в очередь и поставить сообщение в очередь:

Изъятие сообщений из очереди

Сообщения, поставленные в очередь, можно удалить из очереди с помощью метода dequeue интерфейса OracleConnection. Прежде чем удалить сообщение из очереди, вы должны установить параметры удаления из очереди. Класс AQDequeueOptions позволяет указать следующие параметры удаления из очереди:

Условие: задает условное выражение на основе свойств сообщения, свойств данных сообщения и функций PL/SQL. Условие исключения из очереди указывается как логическое выражение с использованием синтаксиса, аналогичного предложению WHERE запроса SQL.

Имя потребителя: если указано, будут доступны только сообщения, соответствующие имени потребителя.

Если очередь является очередью с одним потребителем, не устанавливайте этот параметр.

Корреляция: указывает критерий корреляции (или критерий поиска) для операции удаления из очереди.

Фильтр доставки: указывает тип сообщения, которое нужно исключить из очереди. Вы удаляете из очереди только буферизованные сообщения ( DEQUEUE_BUFFERED ) или только постоянные сообщения ( DEQUEUE_PERSISTENT ), что является значением по умолчанию, или и то, и другое ( DEQUEUE_PERSISTENT_OR_BUFFERED ).

Идентификатор сообщения об удалении из очереди: указывает идентификатор сообщения, которое необходимо исключить из очереди. Это можно использовать для удаления из очереди уникального сообщения, идентификатор которого известен.

Режим удаления из очереди: определяет поведение блокировки, связанное с операцией удаления из очереди. Может принимать одно из следующих значений:

DequeueMode.BROWSE: сообщение удаляется из очереди без получения какой-либо блокировки.

DequeueMode.LOCKED : сообщение удаляется из очереди с блокировкой записи, которая действует на время транзакции.

DequeueMode.REMOVE : (по умолчанию) сообщение удаляется из очереди. Сообщение может быть сохранено в очереди на основе свойств хранения.

DequeueMode.REMOVE_NO_DATA: сообщение помечается как обновленное или удаленное.

Максимальная длина буфера. Указывает максимальное количество байтов, которое будет выделено при удалении сообщения из очереди RAW. Максимальное значение по умолчанию — DEFAULT_MAX_PAYLOAD_LENGTH, но его можно изменить на любое другое ненулевое значение. Если размер буфера недостаточен для размещения всего сообщения, лишние байты будут просто игнорироваться.

Навигация: указывает положение сообщения, которое будет извлечено. Может принимать одно из следующих значений:

NavigationOption.FIRST_MESSAGE : первое доступное сообщение, соответствующее критериям поиска, удаляется из очереди.

NavigationOption.NEXT_MESSAGE : (по умолчанию) следующее доступное сообщение, соответствующее критериям поиска, удаляется из очереди. Если предыдущее сообщение принадлежит группе сообщений, следующее доступное сообщение, соответствующее критериям поиска в группе сообщений, удаляется из очереди.

NavigationOption.NEXT_TRANSACTION : сообщения в текущей группе транзакций пропускаются, а первое сообщение следующей группы транзакций удаляется из очереди. Этот параметр можно использовать только в том случае, если для очереди включена группировка сообщений.

Получить идентификатор сообщения: указывает, нужно ли извлекать идентификатор сообщения, исключенного из очереди. По умолчанию он не извлекается.

Преобразование: указывает преобразование, которое будет применено после исключения сообщения из очереди. Исходный тип преобразования должен соответствовать типу очереди.

Преобразования должны быть созданы в PL/SQL с использованием DBMS_TRANSFORM.CREATE_TRANSFORMATION(. ) .

Видимость. Указывает, будет ли сообщение удалено из очереди как часть текущей транзакции. Может принимать одно из следующих значений:

VisibilityOption.ON_COMMIT : (по умолчанию) операция удаления из очереди является частью текущей транзакции.

VisibilityOption.IMMEDIATE : операция удаления из очереди — это автономная транзакция, которая фиксируется в конце операции.

Параметр Visibility игнорируется в режиме удаления из очереди DequeueMode.BROWSE. Если используется фильтр доставки DEQUEUE_BUFFERED или DEQUEUE_PERSISTENT_OR_BUFFERED , для этого параметра должно быть установлено значение VisibilityOption.IMMEDIATE .

Подождать: указывает время ожидания операции удаления из очереди, если ни одно из сообщений не соответствует критериям поиска.Значение по умолчанию — DEQUEUE_WAIT_FOREVER, указывающее, что операция ждет вечно. Если установлено значение DEQUEUE_NO_WAIT, операция не ожидает. Если указано число, операция удаления из очереди ожидает указанное количество секунд.

Если вы используете DEQUEUE_WAIT_FOREVER , операция удаления из очереди не будет возвращена до тех пор, пока в очереди не появится сообщение, соответствующее критерию поиска. Однако вы можете прервать операцию удаления из очереди, вызвав метод отмены для объекта OracleConnection.

В следующем фрагменте кода показано, как установить параметры удаления из очереди и удалить сообщение из очереди:

Примеры: постановка в очередь и удаление из очереди

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

В примере 25-2 показано, как поставить сообщение в очередь, а в примере 25-3 показано, как удалить сообщение из очереди.

Пример 25-2. Постановка в очередь одного сообщения

В этом примере показано, как получить доступ к очереди, создать сообщение и поставить его в очередь.

Пример 25-3. Удаление из очереди одного сообщения

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

Читайте также: