Oracle Advanced Queue - удаление сообщения после удаления

Мы используем API Oracle JMS для чтения сообщений из Расширенной очереди. Мы используем следующий фрагмент кода для чтения сообщений из очереди:

    MessageConsumer consumer = sess.createConsumer(q);


    for (Message m; (m = consumer.receive()) != null;) 
    {
          new Timer().schedule(new QueueExample(m), 0);
    }

Проблема в том, что после получения сообщения из очереди оно не полностью удаляется из таблицы очереди, только поле STATE изменяется с 0 на 2. Является ли это поведением по умолчанию для клиента Oracle JMS? Мы хотели бы полностью удалить запись из таблицы очереди после того, как сообщение было прочитано из очереди с помощью метода consumer.receive(). Каков подходящий метод API для этого?

1 ответ

Решение

Я думаю, что вы испытываете это из-за retention_time параметр в вашей очереди настраивается на какое-то высокое значение.

Удержание используется для:

Пользователи могут указать, что сообщения будут сохраняться после потребления. Системный администратор может указать продолжительность, в течение которой сообщения будут храниться. Oracle AQ хранит информацию об истории каждого сообщения, сохраняя свойства очереди и сообщения о задержке, истечении и хранении для сообщений, предназначенных для локальных или удаленных получателей. Информация содержит время ENQUEUE/DEQUEUE и идентификацию транзакции, которая выполнила каждый запрос. Это позволяет пользователям вести историю соответствующих сообщений. История может быть использована для отслеживания, хранения данных и операций по извлечению данных.

Вы можете проверить это, проверив скрипт создания очереди и изменив настройку через интерфейс администратора или используя ALTER_QUEUE,

Другие вопросы по тегам