В
Oracle SOA Suite реализован механизм локальной оптимизации вызовов сервисов, реализованных так же на
Oracle SOA Suite. Т.е. если мы из одного композита вызываем с помощью
Web Service Adapter сервис, реализованный в другом композите, то в реальности
Oracle SOA Suite не будет формировать
SOAP-сообщение и делать вызов по протоколу
HTTP. Вместо этого он просто выполнит соответствующий код на
JVM, на которой запущен
Oracle SOA Suite, а значит и клиент сервиса, и его реализация.
Соответствующая оптимизация обладает как преимуществами, так и недостатками.
Преимущества:
- Повышение быстродействия: не тратится время на сериализацию параметров вызова в SOAP-сообщение, передачу данных по сети, а так же обратную десериализацию SOAP-сообщения с ответом.
- Распространение контекста транзакции: т.к. в реальности вместо сетевого взаимодействия вызывается код, работающий на той же JVM, то и инициатор вызова, и вызываемый сервис работают в рамках одной транзакции - если после изменения данных сервисом на клиенте произошел сбой, то транзакция откатывается и изменения не будут сохранены.
Недостатки:
- Отсутствие возможности балансировки нагрузки: при локальной оптимизации всегда будет вызван экземпляр сервиса, расположенный на том же узле кластера, на котором расположен клиент сервиса.
- Проблемы при работе механизма политик OWSM, в частности, связанных с безопасностью. Не все политики OWSM работают в режиме локальной оптимизации вызовов, соответственно, разработчик может ожидать, что для вызова из композита сервиса, реализованного в другом композите, будет требоваться авторизация, а в реальности, т.к. политика не сработала, то никакой авторизации не потребуется, сервис будет доступен любому пользователю.
Локальная оптимизация вызовов включена по-умолчанию, но ее можно отключить. Делается это путем выставления значения свойства
oracle.webservices.local.optimization в
false. Выставить данное свойство в
false можно как в композите-провайдере сервиса, тогда локальная оптимизация будет отключена для всех вызовов сервиса, так и в композите-клиенте, тогда локальная оптимизация будет отключена только для этого клиента.
<binding.ws
port="http://xmlns.oracle.com/CalledBPELProcessApp_
jws/CalledBPELProcess/CalledBPELProcess#wsdl.endpoint(calledbpelprocess_client_
ep/CalledBPELProcess_pt)"
location="http://localhost:8001/soa-infra/services/default/CalledBPEL
Process!1.0/calledbpelprocess_client_ep?WSDL">
<wsp:PolicyReference URI="oracle/wss_username_token_client_policy"
orawsp:category="security"
orawsp:status="enabled"/>
<wsp:PolicyReference URI="oracle/log_policy"
orawsp:category="management"
orawsp:status="enabled"/>
<property name="oracle.webservices.local.optimization">false</property>
</binding.ws>
Понравилось сообщение - подпишитесь на блог и Twitter