2012-03-29 6 views
1

Ich erstelle einen BPEL-Prozess in Netbeans 6.8 und ich rufe einen Webdienst auf, der eine Liste von Ints zurückgibt.So durchsuchen Sie eine Liste von Ints in einem BPEL-Prozess

<xs:complexType name="getHotelsResponse"> 
<xs:sequence> 
<xs:element name="return" type="xs:int" minOccurs="0" maxOccurs="unbounded"></xs:element> 
</xs:sequence> 
</xs:complexType> 

Ich möchte (wenn möglich - nicht mehr sicher ...) durch all diese ints laufen und einen anderen Web-Service für jeden einzelnen von ihnen berufen.

Ich versuchte mit einer ForEach-Aktivität, aber ich kann nicht die Verwendung für meinen Fall herausfinden. Es erfordert einen Startwert und einen Endwert (wenn ich irgendwie herausfinden könnte, wie viele Ints ich zurückbekommen habe), aber selbst dann innerhalb der ForEach-Aktivität, wenn ich eine Zuweisungsaktivität setze, wie bekomme ich das aktuelle Element der Liste in jeder Schleife ?

Antwort

7

Ich habe das folgende BPEL-Snippet verwendet, um den Inhalt einer Liste in eine durch Komma getrennte Zeichenfolge zu fassen. Sie können denselben Code mit einem Aufruf verwenden, um einen externen Service aufzurufen.

<bpel:forEach parallel="no" counterName="Counter" name="ForEach"> 
     <bpel:startCounterValue> 
      <![CDATA[1]]> 
     </bpel:startCounterValue> 
     <bpel:finalCounterValue><![CDATA[count($input.payload/tns:return)]]></bpel:finalCounterValue> 
     <bpel:scope> 
      <bpel:assign validate="no" name="AppendItem"> 
       <bpel:copy> 
        <bpel:from> 

         <![CDATA[concat($Response, $input.payload/tns:return[round($Counter)], ", ")]]> 
        </bpel:from> 
        <bpel:to variable="Response"></bpel:to> 
       </bpel:copy> 
      </bpel:assign> 
     </bpel:scope> 
    </bpel:forEach> 

Sie können die Anzahl der Elemente aus der folgenden XPath erhalten

count($input.payload/tns:return) 

Sie Wert des i-ten Elements zugreifen können mit dem folgenden XPath

$input.payload/tns:return[round($Counter)] 

Sie loswerden kann die round() -Funktion, aber ich musste verwenden, um ein Problem in Apache ODE loszuwerden.

+0

Nur eine kleine Ergänzung zu Warunas exzellenter Antwort: Wenn Sie in jeder Iteration einen anderen Webservice-Endpunkt aufrufen möchten, müssen Sie einen Partnerlink innerhalb des wiederholten Bereichs deklarieren und ihm den Ziel-EPR zuweisen, indem Sie den Partnerlink to-spec verwenden eine Zuweisungsaktivität. – vanto

+0

Wow ... das ist wirklich die einzige Möglichkeit, eine Liste in Bpel zu iterieren? Was für eine primitive Sprache. – wvdz