Получение сообщений из БД

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

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

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

Пример настройки для ActiveMQ

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

        <route>
            <from uri="oracleTopic:topic:AIS_NET.HYDRA_MESSAGES?clientId=ActiveMQ&amp;durableSubscriptionName=HP"/>
            <to uri="activemq:queue:hydra_messages"/>
        </route>

До 

Если ActiveMQ работает не под AIS_NET, может потребоваться выдать права на очередь

BEGIN
  DBMS_AQADM.GRANT_SYSTEM_PRIVILEGE(
    GRANTEE => 'AIS_PROVISIONING',
    PRIVILEGE => 'MANAGE_ANY'
  );

  DBMS_AQADM.grant_queue_privilege (
   privilege     =>     'DEQUEUE',
   queue_name    =>     'AIS_NET.HYDRA_MESSAGES',
   grantee       =>     'AIS_PROVISIONING',
   grant_option  =>      TRUE);
END;
/
GRANT EXECUTE ON DBMS_AQIN TO AIS_PROVISIONING;
/

После этого ActiveMQ будет забирать сообщения из Oracle и помещать в очередь hydra_messages.

После 

ActiveMQ следует подключаться к HYDRA_MESSAGES под пользователем AIS_3P_SERVICES, а не AIS_PROVISIONING, как было раньше. Для этого пользователь бд AIS_3P_SERVICES должен быть активен и привязан к приложению, а также требуется наличие права "Синхронизация со сторонними сервисами" хотя бы у одного абонента.

Обратите внимание, что права на очереди выдаются и забираются пользователем AIS_NET, поэтому при выдаче права "Синхронизация со сторонними сервисами" с интерфейса ООС может потребоваться включенное задание "Отложенное исполнение задач", которое при наличии недостающих прав пользователей БД выполнит синхронизацию прав согласно указанным во внутренних настройках гидры (подобно выдачи прав на представления, таблицы и пакеты).


Другие примеры настройки маршрутизации сообщений доступны в статье Примеры особых конфигураций ActiveMQ

Отключение бизнес-хуков

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

Структура сообщений

Бизнес-хуки передаются в формате XML и состоят из элементов:

Примеры сообщений

<message>
  <message_type_id>1208</message_type_id>
  <message_type_code>MESSAGE_TYPE_Payment</message_type_code>
  <version/>
  <created_at>2022-01-28T12:12:00</created_at>
  <payload>
    <payment>
      <document_id>12811629901</document_id>
      <account_id>178500901</account_id>
    </payment>
  </payload>
</message>


<message>
  <message_type_id>2208</message_type_id>
  <message_type_code>MESSAGE_TYPE_Charge</message_type_code>
  <version/>
  <created_at>2022-07-14T00:08:43</created_at>
  <payload>
    <charge>
      <charge_log_id>289145601</charge_log_id>
      <charge_log_line_id>409855401</charge_log_line_id>
      <change_balance_type_id>3210</change_balance_type_id>
    </charge>
  </payload>
</message>


<message>
  <message_type_id>3208</message_type_id>
  <message_type_code>MESSAGE_TYPE_CreditLimit</message_type_code>
  <version/>
  <created_at>2022-07-14T00:25:48</created_at>
  <payload>
    <credit_limit>
      <document_id>411763901</document_id>
      <account_id>133193991</account_id>
    </credit_limit>
  </payload>
</message>


<message>
  <message_type_id>4208</message_type_id>
  <message_type_code>MESSAGE_TYPE_Correction</message_type_code>
  <version/>
  <created_at>2022-07-13T00:14:30</created_at>
  <payload>
    <correction>
      <charge_log_id>321755501</charge_log_id>
      <account_id>21121191</account_id>
    </correction>
  </payload>
</message>


<message>
  <message_type_id>5208</message_type_id>
  <message_type_code>MESSAGE_TYPE_StopSrvProv</message_type_code>
  <version/>
  <created_at>2022-06-22T12:05:25</created_at>
  <payload>
    <stop_service_provisioning>
      <charge_log_id>199968101</charge_log_id>
    </stop_service_provisioning>
  </payload>
</message>


<message>
  <message_type_id>6208</message_type_id>
  <message_type_code>MESSAGE_TYPE_ArchiveDoc</message_type_code>
  <version/>
  <created_at>2022-05-22T11:05:25</created_at>
  <payload>
    <archive_document>
      <charge_log_id>188983101</charge_log_id>
    </archive_document>
  </payload>
</message>


<message>
  <message_type_id>7208</message_type_id>
  <message_type_code>MESSAGE_TYPE_AutoTopUp</message_type_code>
  <version/>
  <created_at>2022-04-22T13:23:21</created_at>
  <payload>
    <auto_top_up>
      <account_id>188983101</account_id>
      <auto_top_up_id>7581101</auto_top_up_id>
      <auto_top_up_state_id>2195</auto_top_up_state_id>
    </auto_top_up>
  </payload>
</message>


<message>
  <message_type_id>8208</message_type_id>
  <message_type_code>MESSAGE_TYPE_SubjValue</message_type_code>
  <version/>
  <created_at>2022-07-11T08:11:36</created_at>
  <payload>
    <subject_value>
      <subject_id>397259401</subject_id>
      <subject_type_id>18001</subject_type_id>
      <additional_value_type_id>18101</additional_value_type_id>
      <additional_value_id>397259501</additional_value_id>
      <additional_value/>
    </subject_value>
  </payload>
</message>


<message>
  <message_type_id>13208</message_type_id>
  <message_type_code>MESSAGE_TYPE_AutoTopUpPayment</message_type_code>
  <version/>
  <created_at>2022-04-22T13:23:21</created_at>
  <payload>
    <atu_payment>
      <account_id>188983101</account_id>
      <request_state_id>3197</request_state_id>
      <refuse_reason_id>51198</refuse_reason_id>
    </atu_payment>
  </payload>
</message>


<message>
  <message_type_id>14208</message_type_id>
  <message_type_code>MESSAGE_TYPE_ChangeDocState</message_type_code>
  <version/>
  <created_at>2024-04-26T15:19:31</created_at>
  <payload>
    <change_doc_state>
      <document_id>188983101</document_id>
      <document_type_id>7002</document_type_id>
      <new_state_id>4003</new_state_id>
	  <old_state_id>3003</old_state_id>
    </change_doc_state>
  </payload>
</message>