Altova MapForce 2024 Enterprise Edition

In Mappings, die Webservice-Aufrufe enthalten, kann derselbe Webservice, wenn es der Kontext zulässt, mehrmals aufgerufen werden, was normalerweise vermieden werden sollte. Betrachten Sie die folgenden Fälle:

 

Wenn die Verbindung zum Request-Datenelement der Webservice-Komponente eine Wertesequenz überträgt, wird der Webservice mehrmals aufgerufen, nämlich für jedes Datenelement in der Sequenz einmal.

Wenn ein Webservice sich innerhalb einer benutzerdefinierten Funktion befindet und die benutzerdefinierte Funktion während der Mapping-Ausführung mehrmals aufgerufen wird, wird der Webservice mindestens genauso oft aufgerufen. Dies kann durch Konfiguration der Einstellungen für die benutzerdefinierte Funktion vermieden werden. Nähere Informationen dazu finden Sie unter Benutzerdefinierte Funktionen.

Normalerweise soll das Datenelement Response eines Webservice mit einem Zieldatenelement verbunden werden, welches:

oerwartungsgemäß nur einmal erstellt wird (z.B. eine einfache Output-Komponente oder das oberste Datenelement einer komplexen Zielkomponente)

osich nicht in einem Parent-Kontext befindet, für den mehrere Iterationen über dasselbe Datenelement (und daher möglicherweise mehrere Webservice-Aufrufe) erforderlich sind.

 

Was den dritten oben beschriebenen Fall betrifft, könnte dies dazu führen, dass ein Webservice mehrmals aufgerufen wird, obwohl die Mapping-Ausgabe die erwartete wäre. So wird z.B. der unten gezeigte Webservice aufgrund der fehlenden Verbindung zwischen Response und Rows zwei Mal aufgerufen.

mf_semantics_09

Wie gewöhnlich beginnt die Mapping-Ausführung beim Ziel-Root-Element (in diesem Fall Rows). Rows hat keine Verbindung, daher arbeitet sich MapForce durch die Hierarchie nach unten. Der erste Webservice-Aufruf wird gemacht, um das Zieldatenelement statusCode zu befüllen. Als nächstes muss das Datenelement body befüllt werden, daher wird der zweite Webservice-Aufruf durchgeführt. Gäbe es mehr Child-Elemente von Rows, die mit dem Webservice verbunden wären, würde für jedes davon ein neuer Aufruf durchgeführt.

 

Grund dafür ist, dass im oben gezeigten Mapping weder statusCode noch body einen expliziten Parent-Kontext haben (d.h. ihr übergeordnetes Datenelement ist nicht mit einem Quelldatenelement verbunden). Infolgedessen können keine Daten aus deren Parent-Kontext wiederverwendet werden, sondern diese müssen einzeln aus der Quellkomponente, welche in diesem Fall zufällig ein Webservice ist, abgerufen werden. Dieses Problem kann ganz einfach gelöst werden, indem Sie, wie unten gezeigt, eine Verbindung von Response zu Rows ziehen:

mf_semantics_10

Dank der Verbindung zwischen Response und Rows wird der Webservice nun nur einmal aufgerufen. Nach diesem ersten Aufruf befinden sich alle Webservice-Daten im aktuellen Kontext und stehen den Child-Datenelementen von Rows zur Verfügung, daher entfallen weitere redundante Webservice-Aufrufe.

© 2018-2024 Altova GmbH