Как динамически маршрутизировать сообщение в ESB WSO2 на основе файла конфигурации XML

Я пытаюсь направить сообщение на основе информации в фрагменте XML, хранящемся как локальная запись (ключ = mapping_id_ep_v1.xml). Идентификатор, используемый для поиска правильной конечной точки, является частью тела сообщения.

Это фрагмент XML, используемый для сопоставления идентификаторов с конечными точками:

<mappings>
    <mapping id="ep_1">http://localhost:8280/services/ep_1</mapping>
    <mapping id="ep_2">http://localhost:8280/services/ep_2</mapping>
    <mapping id="ep_3">http://localhost:8280/services/ep_3</mapping>
<mappings>

Я извлекаю идентификатор из тела для поиска конечной точки, используя следующую инструкцию:

<property name="LOOK-UP" expression="//controleFile/id" />

Я могу загрузить файл XML в файл свойств, используя следующую запись в последовательности:

<property name="MAPPING" expression="get-property('mapping_id_ep_v1.xml')" />

Я регистрирую свойство, используя следующее утверждение:

<log level="custom">
    <property name="Look-up" expression="get-property('LOOK-UP')" />
    <property name="Mapping" expression="get-property('MAPPING')" />
</log>

Все идет нормально. Я не смог выяснить, как извлечь правильную конечную точку из свойства MAPPING. Кто-нибудь может помочь?

Ответы на вопрос(3)

проблема в том, что вы не можете выполнять выражения xpath над содержимым свойства.

Вы можете легко сделать то, что вам нужно, используя скрипт Javascript после загрузки xml в свойство. Javascript + e4x предлагает простой способ доступа к содержимому переменных XML с помощью выражений xpath.

Надеюсь, это поможет вам.

 nidkil22 июн. 2012 г., 23:20
Спасибо за обмен!
 nidkil18 июн. 2012 г., 13:09
Привет, fipries, спасибо за ответ. Было бы полезно привести пример предлагаемого вами решения. Ты можешь?
 21 июн. 2012 г., 13:41
В моем случае у меня есть локальный ресурс с правилом маршрутизации, который я загружаю в свойство под названием «rules». используя посредник свойства. Я выполняю поиск посредником сценария. Маршрут, который нужно выбрать, основан на содержимом сообщения, которое я загрузил в свойства. Код выглядит следующим образом: var rules = new XML (mc.getProperty («rules»)); var op = mc.getProperty («операция»); var ip = mc.getProperty («ip»); var host = mc.getProperty («хост»); var routingType = -1; routingType = rules.rule. ((source == ip || source == хост) & amp; операция == op) [0] .routingType; mc.setProperty (& APOS; routingType & APOS;, routingType); надеюсь, это поможет!
Решение Вопроса

используя другой подход. Это соответствует ответу, данному bij fipries.

В прокси я добавил следующее:

 <property name="MAPPING" expression="get-property('mapping_id_ep_v1')" />
 <property name="LOOK_UP" expression="//controlFile/id" />
 <log level="custom">
    <property name="MAPPING" expression="get-property('MAPPING')" />
    <property name="LOOK_UP" expression="get-property('LOOK_UP')" />
 </log>
 <script language="js" key="testScript_2" function="getEndpointByID" />
 <log level="custom">
    <property name="EP" expression="get-property('EP')" />
 </log>

Это содержимое mapping_id_ep_v1:

<mappings>
    <mapping id="ep_1">http://localhost:8280/services/ep_1</mapping>
    <mapping id="ep_2">http://localhost:8280/services/ep_2</mapping>
    <mapping id="ep_3">http://localhost:8280/services/ep_3</mapping>
<mappings>

Это код в TestScript_2:

<x>

  function getEndpointByID(mc) {
     var xml = new XML(mc.getProperty('MAPPING'));
     var look_up = new XML(mc.getProperty('LOOK_UP'));
     var ep = xml..mapping.(@id == look_up);
     mc.setProperty('EP', ep + '');
  }

</x>

Прокси-сервер загружает сопоставление xml в свойство. Это свойство преобразуется в XML в коде JavaScript, а затем с помощью LOOK_UP извлекается правильная конечная точка.

Надеюсь, это поможет кому-то еще.

С уважением, Нидкил

это ограничение. На самом деле, это должно быть функциональностью обогащающего посредника. Создаст запрос функции, чтобы исправить это в следующем выпуске ESB.

На данный момент вы можете сделать это с:

Preserve current soap payload : using enrich Replace current body with the content of the property - enrich Evaluate xpath against the current body and extract the required content. (Use that as the EP)- property Restore the message body with preserved payload - enrich

Я знаю ... это хак :)

Ваш ответ на вопрос