Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Verwenden Sie ein benutzerdefiniertes kumulatives Functoid, um Akkumulationsvorgänge für Werte auszuführen, die in einer Nachricht mehrfach auftreten.
Sie müssen beim Entwickeln eines kumulativen Functoids drei Funktionen implementieren. Die drei Funktionen entsprechen dem Initialisieren, Kumulieren und Abrufen von Aktionen, die die Karte zum Ausführen der Akkumulation benötigt. Bevor wir auf diese Funktionen eingehen, ist es wichtig, über die Threadsicherheit zu sprechen.
Schreiben eines Thread-Safe-Funktoids
Der Functoidcode muss threadsicher sein, da unter Stressbedingungen mehrere Instanzen einer Karte gleichzeitig ausgeführt werden können. Zu den zu beachtenden Punkten gehören:
Statischer Zustand muss threadsicher sein.
Der Instanzstatus muss nicht immer threadsicher sein.
Berücksichtigen Sie bei der Gestaltung die Funktionsfähigkeit unter Hochstressbedingungen. Vermeiden Sie es nach Möglichkeit, Verriegelungen zu übernehmen.
Vermeiden Sie nach Möglichkeit die Notwendigkeit der Synchronisierung.
BizTalk Server bietet einen einfachen Mechanismus, um die Komplexität des Schreibens eines threadsicheren kumulativen Funktoids zu reduzieren. Alle drei Funktionen haben denselben ersten Parameter, einen ganzzahligen Indexwert. BizTalk Server weist dem Indexwert eine eindeutige Nummer zu, wenn die Initialisierungsfunktion aufgerufen wird. Sie können diesen Wert als Index in einem Array verwenden, das Werte akkumuliert, wie im folgenden Code gezeigt:
private HashTable cumulativeArray = new HashTable();
…
// Initialization function
public string InitCumulativeMultiply(int index)
{
cumulativeArray[index] = 1.0;
return string.Empty;
}
In diesem Beispiel wird anstelle einer ArrayList eine HashTable verwendet. Dies liegt daran, dass die Initialisierungsfunktion möglicherweise nicht mit Indexwerten in der Reihenfolge aufgerufen wird.
Implementieren der drei kumulativen Funktionen
Sie müssen drei Funktionen für jeden kundenspezifischen kumulativen Funktor umsetzen, den Sie entwickeln. Die Funktionen und die Methoden, die Sie im Konstruktor aufrufen müssen, um sie festzulegen, werden in der folgenden Tabelle zusammengefasst. Alle Funktionen geben Zeichenfolgenwerte zurück.
Hinweis
Sie bestimmen den besten Namen für jede Funktion, aber jede Funktion muss die Anzahl und den Typ von Argumenten angegeben haben.
| Funktionszweck | Argumente | So legen Sie eine Referenz fest | So legen Sie ein Inlineskript fest |
|---|---|---|---|
| Initialisierung | int index | SetExternalFunctionName |
SetScriptBuffer mit functionNumber = 0 |
| Kumulation | int index, string val, string scope | SetExternalFunctionName2 |
SetScriptBuffer mit functionNumber = 1 |
| Herunterladen | int index | SetExternalFunctionName3 |
SetScriptBuffer mit functionNumber = 2 |
Initialisierung
Mit der Initialisierung können Sie die Mechanismen vorbereiten, die Sie zum Durchführen der Akkumulation verwenden. Sie können ein Array initialisieren, einen oder mehrere Werte zurücksetzen oder andere Ressourcen nach Bedarf laden. Der Rückgabewert der Zeichenfolge wird nicht verwendet.
Kumulierung
Hier führen Sie den Akkumulationsvorgang aus, der für Ihr Funktoid geeignet ist. BizTalk Server übergibt die folgenden drei Parameter:
Inhaltsverzeichnis. Ein ganzzahliger Wert, der eine Karteninstanz darstellt. Es können mehrere Karteninstanzen gleichzeitig ausgeführt werden.
Val. Eine Zeichenfolge, die den Wert enthält, der gesammelt werden soll. Es sei denn, Sie schreiben ein String Cumulate Functoid, handelt es sich um einen numerischen Wert.
Bereich. Eine Zeichenfolge mit einer Zahl, die angibt, welches Element oder welches Attributwert angesammelt werden soll. Tatsächliche Werte werden durch eine Implementierung bestimmt.
Sie entscheiden, welche Werte gesammelt werden sollen und welche Werte ignoriert werden sollen. Sie können beispielsweise Werte ignorieren, die nicht unter 0 liegen, aber eine Ausnahme auslösen, wenn ein Wert nicht numerisch ist. BaseFunctoid stellt zwei Funktionen ( IsDate und IsNumeric ) bereit, um die Validierung zu unterstützen.
Hinweis
Wenn Sie IsDate oder IsNumeric in einem Inlineskript verwenden, müssen Sie "RequiredGlobalHelperFunctions" so festlegen, dass die Funktionen für Ihr Skript verfügbar gemacht werden.
Der Zeichenfolgen-Rückgabewert wird nicht verwendet.
Herunterladen
Wenn BizTalk Server das Durchlaufen aller Werte abgeschlossen hat, die durch die Functoideinstellungen in der Abbildung bestimmt werden, fordert er den kumulierten Wert an. Die Get-Funktion hat ein Argument, Index, das ein ganzzahliger Wert ist und eine Map-Instanz darstellt. Die Funktion sollte den Indexwert verwenden, um den angesammelten Wert als Zeichenfolge zu suchen und zurückzugeben.
Beispiel
Das folgende Beispiel zeigt, wie man eine benutzerdefinierte Funktion für die kumulative Multiplikation erstellt. Sie basiert auf einer Ressourcendatei, die drei Zeichenfolgenressourcen und eine Bitmapressource mit 16 x 16 Pixeln enthält.
using System;
using Microsoft.BizTalk.BaseFunctoids;
using System.Reflection;
using System.Text;
using System.Collections;
using System.Globalization;
namespace Microsoft.Samples.BizTalk.CustomFunctoid
{
public class CumulativeMultiplyFunctoid : BaseFunctoid
{
private ArrayList myCumulativeArray = new ArrayList();
public CumulativeMultiplyFunctoid() : base()
{
//ID for this functoid
ID = 6001;
// Resource assembly must be ProjectName.ResourceName if building with VS.Net
SetupResourceAssembly("Microsoft.Samples.BizTalk.CustomFunctoid.CustomFunctoidResources", Assembly.GetExecutingAssembly());
// Pass the resource ID names for functoid name, tooltip
// description and the 16x16 bitmap for the Map palette
SetName("IDS_CUMULATIVEMULTIPLYFUNCTOID_NAME");
SetTooltip("IDS_CUMULATIVEMULTIPLYFUNCTOID_TOOLTIP");
SetDescription("IDS_CUMULATIVEMULTIPLYFUNCTOID_DESCRIPTION");
SetBitmap("IDB_CUMULATIVEMULTIPLYFUNCTOID_BITMAP");
// Put this string handling function under the Cumulative
// Functoid tab in the Visual Studio toolbox for functoids
Category = FunctoidCategory.Cumulative;
// 2 required parameters, no optional parameters
SetMinParams(1);
SetMaxParams(2);
// Functoid accepts three inputs
AddInputConnectionType(ConnectionType.AllExceptRecord);
AddInputConnectionType((~ConnectionType.FunctoidCount) & (~ConnectionType.FunctoidIndex) & (~ConnectionType.FunctoidIteration) & (~ConnectionType.FunctoidCumulative) & (~ConnectionType.FunctoidLooping) & (~ConnectionType.Record));
AddInputConnectionType(ConnectionType.AllExceptRecord);
// Set the output connection type
OutputConnectionType = ConnectionType.AllExceptRecord;
// Set the Initialize, Cumulative and Get functions
SetExternalFunctionName(GetType().Assembly.FullName, "Microsoft.Samples.BizTalk.CustomFunctoid.CumulativeMultiplyFunctoid", "InitCumulativeMultiply");
SetExternalFunctionName2("AddToCumulativeMultiply");
SetExternalFunctionName3("GetCumulativeMultiply");
}
// Initialization function
public string InitCumulativeMultiply(int index)
{
if (index >= 0)
{
if (index >= myCumulativeArray.Count)
{
myCumulativeArray.Add(1.0);
}
else
{
myCumulativeArray[index] = 1.0;
}
}
return "";
}
// Cumulative function
public string AddToCumulativeMultiply(int index, string val, string reserved)
{
if (index < 0 || index >= myCumulativeArray.Count)
{
return "";
}
if (IsNumeric(val))
{
double dval = Convert.ToDouble(val, CultureInfo.InvariantCulture);
myCumulativeArray[index] = (double)(myCumulativeArray[index]) * dval;
}
return myCumulativeArray[index].ToString();
}
// Get Function
public string GetCumulativeMultiply(int index)
{
if (index < 0 || index >= myCumulativeArray.Count)
{
return "";
}
return myCumulativeArray[index].ToString();
}
}
Siehe auch
Verwenden von BaseFunctoid
Entwickeln eines benutzerdefinierten Inline-Functoids
Benutzerdefiniertes Functoid (BizTalk Server-Beispiel)