2013-05-29 28 views
5

W służbie WSO2 ESB Proxy, w jaki sposób można iteracyjne na podstawie wartości całkowitej z jakiejś odpowiedzi usługa, podobnie jak "foreach":WSO2 ESB funkcji foreach

Na przykład taki komunikat odpowiedzi:

<Response> 
    <noOfcustomers>10</noOfCustomers> 
</Response> 

I trzeba powtórzyć 10 razy (w zależności od liczby klientów)

Czy to możliwe? Jak mogę to osiągnąć?

Dzięki za pomoc!

Odpowiedz

0

Możesz iterate na podstawie xpath. Ale obecnie nie mamy przeciwnego wsparcia. Jaki jest twój rzeczywisty przypadek użycia?

+0

Dziękuję za odpowiedź. Muszę wysłać wniosek o kredyt z określoną kwotą opłaty (na przykład 10 miesięcy), a następnie, jeśli wniosek o kredyt został zatwierdzony dla zewnętrznej usługi internetowej, muszę wysłać 10 wiadomości do utworzenia każdej informacji o opłacie: data płatności, minimalna płatność, płatność termin, itp. – user2400243

+0

Ratha jakiś pomysł? – user2400243

+0

Potrzebujesz mediatora klonów? http://docs.wso2.org/wiki/display/ESB451/Clone+Mediator – Ratha

2

Nie znalazłem sposobu, aby to zrobić, ale jest to niechlujne rozwiązanie.

Najpierw potrzebna jest transformacja XSLT.

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" exclude-result-prefixes="xsl xsi"> 
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 
    <xsl:param name="iterations"/> 
    <xsl:template name="for.loop"> 
     <xsl:param name="i"/> 
     <xsl:param name="count"/> 
     <!--begin_: Line_by_Line_Output --> 
     <xsl:if test="$i &lt;= $count"> 
      <iteration> 
       <xsl:value-of select="$i"/> 
      </iteration> 
     </xsl:if> 
     <!--begin_: RepeatTheLoopUntilFinished--> 
     <xsl:if test="$i &lt;= $count"> 
      <xsl:call-template name="for.loop"> 
       <xsl:with-param name="i"> 
        <xsl:value-of select="$i + 1"/> 
       </xsl:with-param> 
       <xsl:with-param name="count"> 
        <xsl:value-of select="$count"/> 
       </xsl:with-param> 
      </xsl:call-template> 
     </xsl:if> 
    </xsl:template> 
    <xsl:template match="/"> 
     <iterations> 
      <xsl:call-template name="for.loop"> 
       <xsl:with-param name="i">1</xsl:with-param> 
       <xsl:with-param name="count"><xsl:value-of select="$iterations"/></xsl:with-param> 
      </xsl:call-template> 
     </iterations> 
    </xsl:template> 
</xsl:stylesheet> 

Następnie użyć transformacji w kolejności tak:

<inSequence> 
    <xslt key="conf:/repository/test/iterations.xslt"> 
     <property name="iterations" expression="//noOfcustomers"/> 
    </xslt> 
    <iterate expression="//iterations/iteration" sequential="true"> 
     <target> 
      <sequence> 

      </sequence> 
     </target> 
    </iterate> 
</inSequence> 

Kolejność mediatora iteracyjne będzie działał dla każdego elementu w „powtórzeń”. Wadą tego podejścia jest to, że zastępujesz treść wiadomości za pomocą iteracyjnego XML, więc musisz użyć wzbogaconego meditora przed transformacją, aby zapisać oryginalną wiadomość w nieruchomości, jeśli chcesz ją ponownie wykorzystać.

+0

Dziękuję Chris !! pozwól mi wypróbować to rozwiązanie! – user2400243

+0

To jest naprawdę bardzo sprytny sposób robienia tego. – zygimantus

0

Jest obsługiwany przez mediatora ForEach od ESB 4.9 i dalej

+0

Wątpię w to. ForEach potrzebuje również do działania wyrażenia xpath. – zygimantus

+0

Tak, nie ma możliwości iteracji nad kontuarem w polu danych. Istnieje jednak FOREACH_COUNTER, który pomaga śledzić liczbę iteracji, które mają miejsce. – maheeka

Powiązane problemy