How to dynamically route message in WSO2 ESB based on XML configuration file

后端 未结 3 1999
清酒与你
清酒与你 2021-01-16 03:31

I am trying to route a message based on information in a XML snippet stored as a local entry (key=mapping_id_ep_v1.xml). The id used to look-up the correct endpoint and it

相关标签:
3条回答
  • 2021-01-16 03:39

    I have got a similar situation. The problem seems to be that you cannot perform xpath expressions over a property content.

    You can easily do what you need by using a Javascript script after loading the xml into a property. Javascript+e4x offers an easy way to access to XML content of variables by xpath expressions.

    0 讨论(0)
  • 2021-01-16 03:41

    I solved my question using a different approach. It is in line with the answer given bij fipries.

    In the proxy I added the following:

     <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>
    

    This is the contents of 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>
    

    This is the code in 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>
    

    The proxy loads the mapping xml into a property. This property is converted to XML in the javascript code and then using LOOK_UP the correct endpoint is retrieved.

    Hope this helps someone else.

    Regards, nidkil

    0 讨论(0)
  • 2021-01-16 03:54

    Yes this is a limitation. Actually, this should be a functionality of the enrich mediator. Will create a feature request to get this fixed for the next ESB release.

    For now you can do this with:

    • 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

    I know... it's a hack :)

    0 讨论(0)
提交回复
热议问题